跳至主要內容

Qt

LincZero大约 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这个选项,没有影响。默认情况下,支持是禁用的

QTQt module

指定项目使用的qt模块

在C++实现级别,使用QT模块使其头文件可用于包含,并使其与二进制连接。

默认值:core gui,对应QtCore和QtGui模块(如果想要构建一个没有 qt-gui 模块的项目,需要使用 “-=” 操作符排除gui)

选项说明
WidgetsWidget(Qt5新增,一般写成greaterThan(QT_MAJOR_VERSION, 4): QT += widgets),相关头文件:控件都是
Webkit网页
Test测试
SQL数据库
QuickQt Quick Application
QMLQML
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项目中将该子项目注释掉即可