提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本文记录了QT工程文件.pro相关的笔记。
一、Qt 中 += 和 *= 的区别
关于Qt中 += 和 *= 的区别,+= 表示添加,不会去重,而 *= 是去重添加,存在则不添加。建议用 *=,尽管 += 也能正常使用,毕竟多一个重复的不影响编译器识别。
QT += core gui
QT += core gui
message($$QT) //会打印 core gui core gui
QT *= core gui
QT *= core gui
message($$QT) //会打印 core gui
二、构建识别平台
关于在pro中区分linux系统,在Qt4套件是不认识 linux 标记的,需要用 unix:!macx 表示。所以如果有兼容Qt4的需求,建议用 unix:!macx 表示。
三、构建定位版本
当检测到某些qt构建环境不满足当前项目要求,避免项目编译失败,可以禁用项目。
//禁用项目后整个项目的代码文件是灰色的不可用,编译会跳过。
lessThan(QT_MAJOR_VERSION, 6) {
error("最低要求Qt6才能用")
}
Project ERROR: 最低要求Qt6才能用。
四、引入第三方库
对于一些跨平台的项目,尤其是需要引入第三方库,需要根据不同的系统不同的位数引入对应文件夹中的库文件,这就需要项目中去识别处理。
#区分不同的系统
path_sys = win
win32 {
path_sys = win
}
linux {
path_sys = linux
}
#Qt4套件不认识linux标记
unix:!macx {
path_sys = linux
}
macx {
path_sys = mac
}
android {
path_sys = android
}
#区分不同的位数 x86_64/amd64/arm64/arm64-v8a
path_bit = 32
contains(QT_ARCH, x.*64) {
path_bit = 64
} else:contains(QT_ARCH, a.*64) {
path_bit = 64
} else:contains(QT_ARCH, a.*64.*) {
path_bit = 64
}
#对应系统和位数的库目录
path_lib = lib$$path_sys$$path_bit
//下面会打印 libwin32/libwin64/liblinux32/liblinux64/libmac32/libmac64/libandroid32/libandroid64
message($$path_lib)
//使用方式
INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/$$path_lib/ -lxxx
五、QCustomplot绘图性能的改善
关于QCustomplot绘图性能的改善。
尽量避免笔宽度大于1的线,默认是1,如果绘制的数据量很大,强烈不建议设置线条宽度大于1,性能会大大降低。
- 避免复杂的填充,例如在具有数千个点的图形之间进行通道填充。
- 在图表拖动期间,可以设置
setNoAntialiasingOnDrag(true)
,可以提高响应速度。 - 避免使用任何类型的alpha(透明)颜色,尤其是在填充中。
- 尽量不要开启抗锯齿,
setNotAntialiasedElements(true)
。 - 避免重复设置完整的数据集,例如使用setData。如果大多数数据点保持不变,例如在运行的测量中,请改用addData。
- 推荐通过
QCPGraph::data()
访问和操作现有数据,效率更高。 - 开启opengl加速,第一步,开启标记,在pro中加上一行
DEFINES += QCUSTOMPLOT_USE_OPENGL
。第二步,链接opengl库:
LIBS += -lopengl32 -lglu32
- 有些Qt版本还可能需要主动引入 QT += widgets。经过实测发现,高频率的绘制比如60fps在开启opengl有性能提升,主要是降低了CPU占用。低频率的绘制还增加了CPU占用。所以建议根据实际场景来处理。这个和数据量好像无关,和绘制数据速度有关。
- 画布关闭抗锯齿属性:
graph->setAntialiased(false)
graph->setAntialiasedFill(false)
graph->setAntialiasedScatters(false)
-
默认是true。
-
画布开启自适应采样,
graph->setAdaptiveSampling(true)
默认是true,所以不用主动设置。
六、Qt4/Qt5/Qt6版本控制
Qt6对core这个核心类进行了拆分,多出来core5compat,因此你需要在pro增加对应的模块已经代码中引入对应的头文件。
//pro文件引入模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
greaterThan(QT_MAJOR_VERSION, 5): QT += core5compat
//代码中引入头文件
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include <QtWidgets>
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
#include <QtCore5Compat>
#endif
七、pro文件中写上版本号、程序图标、产品名称、版权所有、文件说明等信息(Qt5才支持)
可以在pro文件中写上版本号、程序图标、产品名称、版权所有、文件说明等信息(Qt5才支持),其实在windows上就是qmake的时候会自动将此信息转换成rc文件。对于早期的Qt4版本你可以手动写rc文件实现。
#程序版本
VERSION = 2025.10.01
#程序图标
RC_ICONS = main.ico
#产品名称
QMAKE_TARGET_PRODUCT = quc
#版权所有
QMAKE_TARGET_COPYRIGHT = feiyangqingyun
#文件说明
QMAKE_TARGET_DESCRIPTION = QQ: 517216493 WX: feiyangqingyun
八、管理员运行程序|限定在MSVC编译器
管理员运行程序,限定在MSVC编译器,在项目pro文件中增加如下代码。
QMAKE_LFLAGS += /MANIFESTUAC:"level='requireAdministrator' uiAccess='false'" #以管理员运行
QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,"5.01" #VS2013 在XP运行
九、运行文件附带调试输出窗口
运行文件附带调试输出窗口,这个非常有用,很多时候当我们发布程序阶段,我们会遇到程序双击无法运行也不报错提示(开发机器上一切正常),都不知道发生了什么,甚至任务管理器可以看到运行了但是没有界面弹出来,此时就需要在项目的pro文件中加上一行CONFIG += console,带界面的程序也会自动弹出调试窗口打印输出信息,方便找问题,一般没法正常运行的程序都会打印一些提示信息缺啥之类的。
TEMPLATE = app
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj
#就是下面这行用来设置运行文件附带调试输出窗口
CONFIG += console
十、Qt跨平台选择
Qt中也支持多种预定义变量组合判断,去掉生成空的debug和release目录,在pro文件中加一行 CONFIG -= debug_and_release。
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
#endif
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS)
#endif
#ifdef Q_OS_WIN
//windows系统
#else
//非windows系统
#endif
//下面写法编译会报错
#ifdef Q_OS_WIN
#elif Q_OS_LINUX
#endif
//正确写法
#if defined(Q_OS_WIN)
#elif defined(Q_OS_LINUX)
#endif
十一、Qt4转到Qt5类兼容
从Qt4转到Qt5,有些类的方法已经废弃或者过时了,如果想要在Qt5中启用Qt4的方法,比如QHeadVew的setMovable,可以在你的pro或者pri文件中加上一行即可:
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
十二、Qt提供了qDebug机制直接输出打印信息
Qt提供了qDebug机制直接输出打印信息,这个弥补了QtCreator调试很鸡肋的缺点,而且无缝对接日志钩子,使得现场运行期间按照预定的打印信息输出到日志文件,有时候在开发阶段,又不想要看到一堆堆的打印信息,最笨的做法是一行行注释掉qdebug的地方,其实还可以直接pro中加上一行来禁用整个项目的qdebug输出。
#禁用qdebug打印输出
DEFINES += QT_NO_DEBUG_OUTPUT
十三、pro文件可以添加各种处理来使得配置更方便
Qt的pro文件可以添加各种处理来使得配置更方便,比如指定输出文件路径等,这样就不会全部在一堆编译生成的临时文件中找来找去。
#禁用qdebug打印输出
DEFINES += QT_NO_DEBUG_OUTPUT
#自定义define变量 可以在整个项目中使用
#pro文件可以这样判断 contains(DEFINES, videovlc) {}
#代码文件可以这样判断 #ifdef videovlc
DEFINES += videovlc1 videoffmpeg
#关闭编译警告提示 眼不见为净
CONFIG += warn_off
#指定编译生成的文件到temp目录 分门别类存储
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj
#指定编译生成的可执行文件到bin目录
DESTDIR = bin
十四、项目代码文件数量较多处理方法
项目代码文件数量如果很多的话,全部包含在pro项目文件中会显得非常凌乱,甚至滚动条都要拉好久,有两个方法可以处理的更好,推荐方法2
//方法1:pro文件直接全部引入,而不是每个都添加一次,省心省力。
HEADERS += *.h
SOURCES += *.cpp
//方法2:分模块文件夹存放,不同模块用pri包含代码文件,比如界面可以放在ui文件夹,下面搞个ui.pri,然后pro项目文件只需要引入这个pri文件即可。
include($$PWD/ui/ui.pri)
//还可以加上一句包含路径这样可以省去在使用代码的时候不用写文件夹
INCLUDEPATH += $$PWD/ui
//加上上面这行,在使用头文件的时候可以直接 include "form.h",没有加则需要 include "ui/form.h"。
总结
例如:本文参考了《Qt历险记》介绍了QT工程文件.pro相关的技术。