编写目的
分享QT开发过程中可能遇到的问题及相应的解决方案。
常见问题(分类)
定义
Q_OBJECT定义
继承了QObject类,才具有信号槽的能力;凡是QObject类,都应该在第一行代码写上Q_OBJECT,这个宏展开将为类提供信号槽机制、国际化机制以及QT提供的不基于C++ RTTI的反射能力。
注意,moc只处理头文件中标记了Q_OBJECT的类声明,不会处理cpp文件中的类似声明,所以需要将这个宏定义在头文件中。
编译
条件编译
出于版本管理的需求,进行预编译宏控制的条件编译时,若涉及Q_OBJECT声明的类,注意同步MSVC编译环境(Windows环境)与MOC编译环境的预编译宏,否则容易出现因预编译宏不一致导致的编译问题。
或仅管理相关模块的调用流程,无需设置MOC环境(相关模块代码编译在可执行文件中)。
调试
QT调试信息
在Visual Studio中调试QT环境,可能因QT VS Tools配置文件加密或损坏导致调试过程中无法查看QString等类型信息。
解决方案
Visual Studio环境启动后,更换相应的配置文件。C:\Users\TR\Documents\Visual Studio 2019\Visualizers下的qt5.natvis文件,即可在调试过程中查看QString等变量信息。
如上图所示,替换qt5.natvis文件后,调试过程可正常查看QString及QVector等类型的信息。
翻译
换行符
QT Linguist内,无论是用哪种符号“\r\n”、“\n\r”、“\n”,都会被识别成字符串,所以在Linguist语言家中,翻译部分加上回车符、换行符是无效的。
最简单的解决方案,直接在Linguist的翻译里按下Enter回车键,可实现换行。
多语言翻译
加载多语言翻译文件后,再进行涉及翻译的代码模块初始化,加载翻译文件之前的模块无法翻译。
网络通信
HTTP
使用QNetworkReply类实现HTTP通信时,需注意QT可能将错误码进行内部转义。
Constant | Value | Description |
---|---|---|
QNetworkReply::ContentAccessDenied | 201 | the access to the remote content was denied(similar to HTTP error 403) |
QNetworkReply::ContentNotFoundError | 203 | the remote content was not found at the server(similar to HTTP error 404) |