Qt开发经验小技巧合集 (11)

Qt对操作系统层的消息也做了很多的封装,可以直接拿到进行处理(如果需要拦截处理要用对应操作系统的API才行比如鼠标键盘钩子),比如系统休眠和唤醒做一些处理。

//主窗体头文件 protected: bool nativeEvent(const QByteArray &eventType, void *message, long *result); #ifdef Q_OS_WIN bool winEvent(MSG *message, long *result); #endif //主窗体实现函数 #ifdef Q_OS_WIN #include "Windows.h" #endif bool frmMain::nativeEvent(const QByteArray &eventType, void *message, long *result) { if (eventType == "windows_generic_MSG") { #ifdef Q_OS_WIN MSG *msg = static_cast<MSG *>(message); //qDebug() << TIMEMS << msg->message; if (msg->wParam == PBT_APMSUSPEND && msg->message == WM_POWERBROADCAST) { //系统休眠的时候自动最小化可以规避程序可能出现的问题 this->showMinimized(); } else if (msg->wParam == PBT_APMRESUMEAUTOMATIC) { //休眠唤醒后自动打开 this->showNormal(); } #endif } else if (eventType == "NSEvent") { #ifdef Q_OS_MACOS #endif } return false; } #ifdef Q_OS_WIN bool frmMain::winEvent(MSG *message, long *result) { return nativeEvent("windows_generic_MSG", message, result); } #endif

Qt的pro项目管理配置文件中也可添加各种编译前后的操作及配置,主要通过 QMAKE_POST_LINK和QMAKE_PRE_LINK,他们支持的函数以及写法,可以在QtCreator的帮助中搜索 qmake Function Reference 查看详情说明。

QMAKE_PRE_LINK 表示编译前执行内容

QMAKE_POST_LINK 表示编译后执行内容

srcFile1 = $$PWD/1.txt srcFile2 = $$PWD/2.txt dstDir = $$PWD/../bin #windows上需要转换路径斜杠 其他系统不需要 srcFile1 = $$replace(srcFile1, /, \\); srcFile2 = $$replace(srcFile2, /, \\); dstDir = $$replace(dstDir, /, \\); #编译前执行拷贝 多个拷贝可以通过 && 符号隔开 QMAKE_PRE_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir #编译后执行拷贝 多个拷贝可以通过 && 符号隔开 QMAKE_POST_LINK += copy /Y $$srcFile1 $$dstDir && copy /Y $$srcFile2 $$dstDir

Qt新版本往往会带来一些头文件的更新,比如以前使用QPainter绘制,不需要额外包含QPainterPath头文件,而5.15版本开始就需要显示主动引入#include "qpainterpath.h"才行。

Qt6.0发布了,是个比较大的改动版本,很多基础的类或者组件都放到单独的源码包中,需要自行官网下载并编译,默认不提供集成在开发目录下,需要手动编译并集成,比如QRegExp,QTextCodec类,需要编译集成后pro文件 QT += core5compat 才能用, 具体说明在https://doc.qt.io/qt-6/qtcore5-index.html。

qDebug输出打印信息,默认会完整打印转义字符,例如:\ " \t \n" 等,所以当你发现你明明设置了转义字符以后打印确还是转义前的字符,这就懵逼了,其实这是qdebug为了方便调试将各种字符都打印输出。无可否认,很多时候,我们极其兴奋的享受着Qt带来的各种轮子各种便利,但是偶尔,稍不留意,这些便利可能也会坑你一把。要做的就是擦亮眼睛,时刻谨慎,一步一个脚印踏踏实实码代码。

QString s1 = R"(\:device0)"; //TNND居然输出的是 \\:device0 qDebug() << s1; //这次终于正确的输出 \:device0 qDebug().noquote() << s1;

很多人有疑问为何qss对浏览器控件中的网页样式没法控制,其实用屁股想想也知道,那玩意是html css去控制的,和Qt一毛钱关系也没有,根本管不着,如果想要对滚动条样式设置,可以在网页代码中设置样式就行。

<style type="text/css"> ::-webkit-scrollbar{width:0.8em;} ::-webkit-scrollbar-track{background:rgb(241,241,241);} ::-webkit-scrollbar-thumb{background:rgb(188,188,188);} </style>

Qt的ini配置文件默认不支持直接读写中文,需要手动设置下编码格式才行,强烈建议统一用utf-8编码,包括代码文件。

//设置了编码以后配置文件内容为 Company=上海物联网技术研究中心 //没有设置编码则配置文件内容为 Company=\xe4\xb8\x8a\xe6\xb5\xb7\xe7\x89\xa9\xe8\x81\x94\xe7\xbd\x91\xe6\x8a\x80\xe6\x9c\xaf\xe7\xa0\x94\xe7\xa9\xb6\xe4\xb8\xad\xe5\xbf\x83 void App::readConfig() { QSettings set(App::ConfigFile, QSettings::IniFormat); set.setIniCodec("utf-8"); set.beginGroup("AppConfig1"); App::Company = set.value("Company", App::Company).toString(); set.endGroup(); } void App::writeConfig() { QSettings set(App::ConfigFile, QSettings::IniFormat); set.setIniCodec("utf-8"); set.beginGroup("AppConfig1"); set.setValue("Company", App::Company); set.endGroup(); }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxjpf.html