Qt
大约 8 分钟
Qt
目录
.pro 工程配置文件(Qt Project file)
参考:
简概
作用
- 列举工程中包含的源文件
- .pro文件与平台无关,可使用qmake将其生成与平台相关的makefile
qmake
详见Qt 的帮助文档中的 qmake 介绍
作用
- qmake工具有助于简化不同平台上开发项目的构建过程,是 Qt 工具包中带的一个非常方便的工具
- 能用于生成 Makefile 以及各种工程文件,创建每个makefile只需要几行信息
- 还能生成 Microsoft Visual Studio 可以使用的项目文件等
- 最关键的是它可以自动解决依赖关系,不用手写 Makefile。而且是跨平台的,您可以将qmake用于任何软件项目,无论它是否使用qt编写
常用配置
常使用的变量(对于app或者lib工程)
红字类
【资源类】 HEADERS 指定工程的C++头文件(.h) SOURCES 指定工程的C++实现文件(.cpp) FORMS 指定需要UIC处理的的UI文件(.ui) RESOURCES 指定需要RCC处理的QRC文件(.qrc) 【搜寻路径类】 INCLUDEPATH 指定编译项目时搜索全局头文件的路径 如果是不同系统的路径,可以添加系统判断 LIBS 指定工程要链接的库 库既可使用绝对路径,也可使用Unix的**-L和-l(分别是文件夹和文件)** DLLDESTDIR 指定目标库文件放置的目录 默认值:与DESTDIR相同 DEPENDPATH 指定要查找以解析依赖项的所有目录的列表 DISTFILES 指定要包含在dist目标中的文件列表 例: DISTFILES += ../program.txt
【生成路径类】 DESTDIR 指定.exe目标文件(可执行文件)生成的目录 默认值:平台相关,Linux为当前目录,Win为debug/release目录 MOC_DIR 指定moc_文件生成的路径 moc_xxx.cpp和moc_xxx.h文件 RCC_DIR 指定rcc_文件生成的路径 有可能不生成,qrc_文件呢??? UI_DIR 指定.ui生成的.h文件的路径 ui_xxx.h文件 OBJECTS_DIR 指定.obj文件生成的路径 【配置类】 VERSION 指定目标库的版本号 RC_ICONS 指定工程的ico图标 Qt5才支持 QT 指定工程所要用到的Qt模块 TARGET 指定可执行文件或库的基本文件名 默认值:当前的目录名 CONFIG 指定各种用于工程配套和编译的参数 DEFINES 指定预定义的C++预处理器符号 INSTALLS 指定执行 make install
等安装过程时将安装的资源列表(windows下一般不用这个操作)
蓝字类(函数)
include() 用来包含pri文件 greaterThan(QT_MAJOR_VERSION, 4){} 版本的条件判断
黄字类(自定义变量或变量子属性)
target.path 定义描述了安装生成目标的位置
例target.path += $$[QT_INSTALL_PLUGINS]
+INSTALLS += target
例如:libs.depends = 3rdparty 编译依赖 例如:xpath = $${OUT_PWD}/../ 自定义变量
其他补充
LIBS:例:-L/usr/local/lib
和-ldb_cxx
TEMPLATE
模板变量告诉qmake为这个应用程序生成哪种makefile
主要的三种工程文件分类,默认值:app
选项 | 说明 | 示例 |
---|---|---|
app | 单独的应用程序 | TEMPLATE = app |
lib | 静态和动态库 | TEMPLATE = lib |
subdirs | 递归编译 | TEMPLATE = subdirs |
aux | 创建一个不建任何东西的Makefile。 如果没有编译器需要被调用来创建目标,比如你的项目使用解释型语言写的,使用此功能 | |
vcapp | 仅适用于Windows。创建一个Visual Studio应用程序项目 | |
vclib | 仅适用于Windows。创建一个Visual Studio库项目 |
CONFIG
具体项目配置和编译器选项,值由qmake内部识别并具有特殊意义
选项 | 说明 |
---|---|
【构建类】 | |
debug | 编译具有调试信息的可执行文件或者库,链接调试版的Qt库 |
release | 编译不具有调试信息的可执行文件或者库,链接发行版的Qt库。如果同时指定debug和release,则debug有效 |
debug_and_release | 项目准备以debug和release两种模式构建 |
debug_and_release_target | 此选项默认设置。如果也指定了debug_and_release,最终的debug和release构建在不同的目录 |
build_all | 如果指定了debug_and_release,默认情况下,该项目会构建为debug和release模式 |
【其他类】 | |
plugin | 编译一个插件(插件总是动态库,因此这一参数暗指dll参数) |
warn_off | 关闭大量警告(默认情况下警告的状态会打开) |
qt | 指应用程序或者库使用Qt(默认包含) |
dll | 动态链接库 |
staticlib | 静态链接库 |
console | 应用程序需要写控制台(使用cout、cerr、qWarning(),等等) |
app_bundle | 只使用与Mac OS X编译,指可执行文件被放到束中(Mac OS X的默认情况) |
lib_bundle | 只适用于Mac OS X编译,指库被放到框架中 |
thread | 启用线程支持。当CONFIG包括qt时启用,这是缺省设置 |
【支持类】 | |
c++11 | 启用c++11支持。如果编译器不支持c++11这个选项,没有影响。默认情况下,支持是禁用的 |
c++14 | 启用c++14支持。如果编译器不支持c++14这个选项,没有影响。默认情况下,支持是禁用的 |
QT
(Qt module)
指定项目使用的qt模块
在C++实现级别,使用QT模块使其头文件可用于包含,并使其与二进制连接。
默认值:core gui,对应QtCore和QtGui模块(如果想要构建一个没有 qt-gui 模块的项目,需要使用 “-=” 操作符排除gui)
选项 | 说明 |
---|---|
Widgets | Widget(Qt5新增,一般写成greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ),相关头文件:控件都是 |
Webkit | 网页 |
Test | 测试 |
SQL | 数据库 |
Quick | Qt Quick Application |
QML | QML |
Mulitmedia Widgets | 多媒体窗口 |
Core | 核心,相关头文件:<QDir> |
GUI | 显示图形,我猜测是Qt5之前没Widget模块时用的 |
Network | 网络 |
Mulitmedia | 多媒体 |
Quick Controls | |
Quick Dialogs | |
script | 链接QtScript,相关头文件:<QScriptEngine> <QScriptValue> <QScriptValueList> |
LIBS
库既可使用绝对路径,也可使用Unix的-L和-l(例-L/usr/local/lib
和-ldb_cxx
,分别是文件夹和文件)
-L、-l的用法:
LIBS += -L$${ADS_OUT_ROOT}/3rdparty/lib # 文件夹-L
LIBS += -lqtadvanceddockingd # 文件-l
# 这两句等价于
LIBS += -l$${ADS_OUT_ROOT}/3rdparty/lib/qtadvanceddockingd # 文件-l
其他语法
操作符
=
操作符,覆盖以前的各个值+=
操作符,扩展变量的值-=
操作符,移除所有出现指定的值*=
操作符,在一个变量上添加一个值,但要求被添加的值不再变量的列表上,否则就什么也不做~=
操作符,使用指定的值替换符合正则表达式的值(例如SOURCE ~= s/\.cpp\b/.cxx
使用.cxx替换所有.cpp文件的扩展名)
其他语法
qmake的存取函数
存取函数 | 说明 |
---|---|
$$varName 或者$${varName} | .pro文件中qmake变量在那一时刻的值 |
$$(varName) | 当qmake运行时环境变量的值 |
$(varName) | 当处理makefile时环境变量的值 |
$$[varName] | Qt的配置参数值 |
内置函数
内置函数 | 说明 |
---|---|
$$lower() | 把字符串转换为小写 |
$$system() | 允许从外部应用程序中产生字符串。例如OS_VERSION=$$system(uname -r) |
路径问题
路径宏
QT安装路径有关(QT_INSTALL开头)
$$[QT_INSTALL_PLUGINS]
,插件路径,安装路径\QT\Qt-6.0.3\msvc2019_64\plugins
$$[QT_INSTALL_EXAMPLES]
,示例路径,安装路径\QT\Examples\Qt-6.0.3
源代码路径有关
$$PWD
,指定指向包含正在解析的当前文件的目录的完整路径(Linux也有个PWD命令:Print Work Directory)
构建路径有关
./
,和 "$$PWD" 不同,前者是build路径,后者是源代码项目路径$${OUT_PWD}
,指定指向qmake存放生成的Makefile的目录的完整路径(Windows下与debug+release文件夹所在的目录)
使用场景和选择
SOURCES += \ core.cpp HEADERS += \ core.h DESTDIR = ../Bin # 生成路径用./ INCLUDEPATH += $$PWD/../.. # 正确写法 #INCLUDEPATH += ../.. # 我经常用这种写法,也能运行,但应该不妥 DEPENDPATH += $$PWD/../..
使用举例
ADS_OUT_ROOT = $${OUT_PWD}/.. # 定义常量路径 = 指定指向qmake存放生成的Makefile的目录的完整路径 DESTDIR = $${ADS_OUT_ROOT}/lib # 输出路径
条件判断语法
基本语法
# 【condition不是关键字】可以是平台名字(例如:win32、unix、macx)
condition {
then-case
# 使用标准语法为变量赋值,例如 SOURCES += serial_win.cpp
} else {
else-case
# 使用标准语法为变量赋值,例如 SOURCES += serial_unix.cpp
}
# 也可以写成单行形式
condition: then-case
# 可以在条件中使用结果合并,并与contains()合用,例如
contains(OS_VERSION, SunOS): SOURCES += mythread_sun.c
使用举例1
# 版本判断选择组件
lessThan(QT_VERSION, 0x050600){QT += webkitwidgets}
greaterThan(QT_VERSION, 0x050500){QT += webenginewidgets}
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
使用举例2
CONFIG(debug, debug|release){
win32 {
LIBS += -lqtadvanceddockingd
}
else:mac {
LIBS += -lqtadvanceddocking_debug
}
else {
LIBS += -lqtadvanceddocking
}
}
else{
LIBS += -lqtadvanceddocking
}
unix:!macx {
LIBS += -lxcb
}
编译依赖(影响编译顺序)
举例
# build order: 3rdparty -> libs -> app-static -> app & test
libs.depends = 3rdparty
app.depends = libs app-static
test.depends = libs app-static
补充
- Q:递归项目如何删除子项目(右键会发现删除项目的选项是灰色的)
- A:在pro项目中将该子项目注释掉即可