Qt开发之踩雷日记

报错信息:

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语言中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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值