QT常见使用问题

342 阅读4分钟

msvc + QT 中文报错 “常量中有换行符”

  • 原因:windows是按照GBK中文编码, qt默认是utf-8,对中文支持有问题。
  • 解决方法:在.pro文件中加入
QMAKE_CXXFLAGS += /utf-8

在使用中文参数时,最好加上tr()或者QStringLiteral()进行修饰;

设置可执行程序图标

  • 首先将.ico格式的图标资源放到工程文件所在文件夹中的任意文件夹中 比如icon文件夹
  • 然后在.pro文件中加入
RC_ICONS = icon/logico.ico   //icon就是文件夹   .ico的就是图标文件

添加工程预处理宏定义

  • .pro文件中添加
DEFINES += MY_DEFINE    // 有些第三方库的使用时,可能存在一些兼容性的问题,通过定义版本宏来链接编译
DEFINES += MY_DEFINE2 = "字符串"   // 这个效果就类似#defien的使用了,注意双引号内部的实现,以及转义字符的使用

多线程中需要更新UI资源

  • 不要在线程中对UI进行操作,如果需要,就实现一组信号槽,线程中发出信号,由主进程实现槽函数对资源进行刷新

connect绑定信号槽 有很多写法

// 写法1,对参数列表要求严格,要注意检查
connect(m_pBtn,SIGNAL(sigClicked()),this,SLOT(onClicked()));
connect(m_pBtn,SIGNAL(sigClicked(bool)),this,SLOT(onClicked(bool)));

// 写法2
connect(m_pBtn,&MyButton::sigClicked,this,&Widget::onClicked); 这种写法再存在重载函数的时候会报错,需要改成
connect(m_pBtn, static_cast<void (MyButton::*)(bool)>(&MyButton::sigClicked), this, &Widget::onClicked);    // 还是用写法1吧

// 写法3
如果槽函数很简单,可以直接换乘lambda表达式(一种生成匿名函数的语法糖)

屏蔽警告

在使用第三方库的时候,提示很多编译警告,可以手动设置忽略这些编译警告。

  1. 在pro文件中添加屏蔽指定警告代码:
#屏蔽 4819的警告
QMAKE_CXXFLAGS_WARN_ON += -wd4819    

2.pro文件中添加代码直接屏蔽所有警告

DEFINES += QT_NO_WARNING_OUTPUT\
           QT_NO_DEBUG_OUTPUT         
  1. 添加预编译代码到频繁报警告的头文件中
#pragma warning( disable : 4819 )

添加或者更新组件

提示“此操作至少需要一个处于启动状态的有效资料档案库”,此时需要手动添加一个资料库链接 选择“设置”->"储存库"->"临时储存库"->"添加" -> 在空白行中对应列名输入你的QT账号的用户名,密码,第三列填写对应系统版本的资料库链接

如果是Windows操作系统,那么复制以下链接: mirrors.tuna.tsinghua.edu.cn/qt/online/q… 如果是Linux操作系统,那么复制以下链接: mirrors.tuna.tsinghua.edu.cn/qt/online/q… 如果是macOS操作系统,那么复制以下链接: mirrors.tuna.tsinghua.edu.cn/qt/online/q… 然后一直下一步就可以了

读取数据库参数,结果集带中文转换编码格式失败

通过 执行 show VARIABLES like '%CHARACTER%'看到对应结果集的编码格式character_set_results为utf8mb4。这与utf8是存在差异的,差异体现在对emoji符号的支持上。所以对读取到的结果集按utf8格式转换为gbk时依旧是显示乱码的。 解决方法是在执行select前,执行一次 set names utf8,此时结果集返回的就是标准的utf8格式

未继承QObject的类使用信号槽报错

connect是QObject中的静态方法,使用必须继承QObject类,class A : public QObject 然后在类的最开始加上Q_OBJECT 之后一定要重新qmake一次,否则无法编译通过

关于字符串的编码格式和输出格式

常见3种编码方式

image.png

tolocal8bit是转成本地编码格式, 也就是unicode, 用于桌面输出中文时一般需要转为该类型 toutf8是转成utf8格式,常用于字符串协议数据交换,或者数据库数据交互 toLatin1是转成ascii格式,常见于与串口的交互方式。 如果需要发送或者使用16进制的方式, QByteArry支持toHex()的方式将原始字符串转化为对应的16进制字符串,但字符串是连续的,可以使用toHex的重载方法 toHex(' ')使用空格将每个字节分开

开发中遇到过使用readAll类似接口读取网络或者串口的返回数据,返回类型是QByteArray,通过arg()的方式构造字符串会存在异常,字符串的转换似乎有问题,无法正常显示。(解决方式未发现,应该是与arg有关) 建议使用QString(QbyteArray)的构造方式生成QString,在结合需要实现从QString的编码或输出格式的自由转换