报错信息:
C:\Users\MSI-NB\Desktop\03_SignalAndSlot\SubWidget.cpp:4: error: C2533: “SubWidget::{ctor}”: 构造函数不能有返回类型
但构造函数中并没有返回类型啊??
原因:
定义类的时候没有加 ; 构造函数默认把整个类作为返回值了。
报错信息:
C:\Users\MSI-NB\Desktop\03_SignalAndSlot\SubWidget.h:8: error: C2011: “SubWidget”:“class”类型重定义
C:\Users\MSI-NB\Desktop\03_SignalAndSlot\MainWidget.cpp:9: error: C2027: 使用了未定义类型“SubWidget”
C:\Users\MSI-NB\Desktop\03_SignalAndSlot\MainWidget.cpp:9: error: C2227: “->{ctor}”的左边必须指向类/结构/联合/泛型类型
C:\Users\MSI-NB\Desktop\03_SignalAndSlot\MainWidget.cpp:21: error: C2027: 使用了未定义类型“SubWidget”C:\Users\MSI-NB\Desktop\03_SignalAndSlot\MainWidget.cpp:21: error: C2227: “->{dtor}”的左边必须指向类/结构/联合/泛型类型
C:\Users\MSI-NB\Desktop\03_SignalAndSlot\MainWidget.cpp:21: error: C1903: 无法从以前的错误中恢复;正在停止编译
原因:
将代码写在了 #endif 之外了。
P.S:
#ifndef x //先测试x是否被宏定义过
#define x
程序段1 //如果x没有被宏定义过,定义x,并编译程序段1
#endif
程序段2 //如果x已经定义过了则编译程序段2的语句,“忽视”程序段1。
#ifndef 和 #endif 必须成对出现
报错信息:
C:\Qt\Qt5.12.3\5.12.3\msvc2015_64\include\QtCore\qobject.h:235: error: C2338: No Q_OBJECT in the class with the signal
原因:
由于没有继承QObject类而引起的,只需要继承QObject类即可。
报错信息:
LNK 2001: 无法解析外部符号
未找到文件:SubWidget.obj
原因:
暂时不知道为什么
解决方法:
删除build-文件夹,重新进行编译。
错误现象:
Qt 控件上的中文显示乱码。
解决方法:
在头文件的声明部分加上
#pragma execution_character_set("utf-8")
P.S:
此时我将工具→选项→行为中的文件编码也一并改成了UTF-8,删除build-文件夹重新编译,并重启Qt,发现注释中的中文又变成乱码了,于是又改回GBK编码。
报错信息:
LNK1158 无法运行“rc.exe”
解决方法:
到C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86目录下将rc.exe以及rcdll.dll拷贝到
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin以及C:\Qt\Qt5.12.3\5.12.3\msvc2015_64\bin目录下
报错信息:
无法打开XXX.exe文件进行写入
解决方法:
很可能是因为这个.exe文件已经打开了,但不是以可见窗口的形式打开,所以我们不知道。可以用任务管理器,找到该进程并结束它。
报错信息:
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
将QTcpSocket的对象移到子线程以后,write数据会出现这个提示
解决方法:
重写QTcpSocket, 增加一个写数据的槽函数,在槽函数里调用write
错误现象:
在.cpp文件中引入了对应的.h文件,但类无法被识别,不会触发自动联想
报错信息:
C2653:“CUserInfoCreator”:不是类或命名空间名称
错误原因:
建.h文件的时候建到src文件夹下了,虽然手动删除了,但是在改动后QT的弹窗中又选择了保存,于是又在src文件夹中生成了.h文件,导致.cpp引入的.h文件实际上是src文件夹下没有被实现的.h文件……
解决方法:
手动删除src文件夹下的.h文件,在QT的弹窗中选择“cancel”,这是第二次遇到这种问题了……
报错信息:
E:\Demo\QtDemo\M2M0917\Program..\..\Program\m2mClient\src\ClientSocketHandler.cpp:5: error: C2614: “CClientSocketHandler”: 非法的成员初始化:“QObject”不是基或成员
解决方法:
多半是.h文件中没有引入<QtCore>
报错信息:
QLayout: Attempting to add QLayout "" to CClientWindow "", which already has a layout
错误原因:
在创建子布局的时候,已经通过构造函数为其指定了其父布局,对其父布局调用addChildLayout()时,又重复地添加了这个子布局。
解决方法:
创建子布局时,不为其指定父对象。
QLayout的无参构造函数的说明是:Constructs a new horizontal/vertical box. You must add it to another layout.
所以我们最终需要将这个布局添加到其它布局中,也就是对其父布局调用addChildLayout()
报错信息:
error: LNK1181: 无法打开输入文件“on_data_d.lib”
错误原因:
①在.pro文件中,没有按照编译顺序引入子工程,比如B是依赖于A的,引入时B却写在A之前,就会出错
②构建的路径有误
问题现象:
QNetworkRequest发送get请求时,用QUrlQuery的addQueryItem方法设置参数失效,打印url内容也没有将参数键值对成功拼接上
错误原因:
先对QNetworkRequest设置了QUrl对象,然后才将添加了参数的QUrlQuery对象设置到QUrl中,此时与QNetworkRequest关联的QUrl并不携带参数,并没有自动更新。
解决方法:
先将参数添加到QUrlQuery对象中,然后为QUrl设置QUrlQuery对象,最后再将QUrl设置到QNetworkRequest对象中。
问题现象:
新增一个信号后,报错信息先是LNK2019无法解析的外部符号。发现是忘了在头文件加上Q_OBJECT,加上之后运行又报错一堆的LNK2001
解决方法:
重新qmake一下
报错信息:
E:\Demo\QtDemo\ModbusMaster\Program\include\ModbusOpt.h:8: error: C2011: “CModbusOpt”:“class”类型重定义
E:\Demo\QtDemo\ModbusMaster\Program\include\ModbusOpt.h(8): error C2011: “CModbusOpt”:“class”类型重定义
E:\Demo\QtDemo\ModbusMaster\Program\include\ModbusOpt.h(8): note: 参见“CModbusOpt”的声明错误原因:
类的头文件中缺少下列语句
#ifndef XXX
#define XXX
...
#endif
如果这个类的头文件在其它类的头文件中引用,就会报类型重定义的错误,如果在其它类的源文件中引用则不会报错。
这个语句是用来检查重复引用的,如果没有写,然后在多处引用这个头文件,就相当于是多次定义该类,因此报错信息提示类型重定义。
在源文件中引用头文件不会出现这个问题,因为每个源文件都是单独编译的,编译器会将头文件和源文件分开编译,因此不会出现重复定义的情况。
在C++中,头文件包含其他头文件是通过预处理器指令
#include
实现的。当编译器遇到#include
指令时,它会将指定的文件内容插入到当前文件中。具体来说,编译器会首先搜索指定文件的路径,找到后读取该文件的内容,并将其插入到当前文件中
#include
指令所在的位置。这样,包含指令所引用的所有标识符和定义都可以在当前文件中使用。如果被包含的头文件本身也包含了其他头文件,则编译器会重复上述过程,递归地将所有相关的头文件都插入到当前文件中,直到所有依赖关系都被处理完毕。
需要注意的是,为了避免出现循环包含的情况,通常会采用条件编译等技术来控制头文件的包含顺序和次数。
源文件的编译则是将源代码转换为可执行程序的过程。在编译源文件时,编译器将源代码转换为目标代码,并将其链接到其他目标文件和库文件中,生成最终的可执行程序。在编译过程中,编译器会将所有需要的头文件包含进来,以便正确解释源代码中的各种定义和声明。
//更新于5.23