首页 > 编程笔记

Qt pro文件详解

默认情况下,每个 Qt 项目都包含一个后缀名为.pro、名称和项目名相同的文件,我们通常称它为项目管理文件或者工程管理文件(简称 pro 文件)。

例如,新建一个 Qt 项目,如下图所示:

图 1 项目结构

该项目的项目名为 Demo,项目中共包含 4 个文件,其中 Demo.pro 就是项目管理文件。

任何一个 Qt 项目都至少包含一个 pro 文件,此文件负责存储与当前项目有关的配置信息,比如:

所谓模块,可以简单地理解为文件夹或者压缩包,内部包含多个功能相近的类。作为一款成熟的 GUI 框架,Qt 提供了大量的类,根据这些类的功能,Qt 将它们分成了几个组,每个组称为一个模块。打开 Qt Creator 的帮助界面并搜索“All modules”,可以看到 Qt 的所有模块。

一个项目中可能包含上百个源文件,Qt 编译这些源文件的方法是:先由 qmake 工具根据 pro 文件记录的配置信息生成相应的 makefile 文件,然后执行 make 命令完成对整个项目的编译。也就是说,pro 文件存储的配置信息是用来告知编译器如何编译当前项目的,所以一个 Qt 项目要想完美运行,既要保证各个源文件中程序的正确性,还要保证 pro 文件中配置信息的合理性。

对于一个刚刚创建好的 Qt 项目,pro 文件并不是空的,而是包含一些基本的配置信息。实际开发中,Qt 会自动修改 pro 文件的内容,但有时也需要我们手动修改,例如程序中用到某个第三方库时,就需要我们手动修改 pro 文件。

接下来,我们就为大家详细地讲解 pro 文件中各个配置信息的含义,以及如何手动修改 pro 文件。

pro文件中的配置信息

在图 1 所示的 Demo 项目中,双击打开 Demo.pro 项目管理文件,会看到如下内容:

#-------------------------------------------------
#
# Project created by QtCreator 2021-08-31T16:05:04
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Demo
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

以上是 Demo.pro 配置文件中默认包含的内容。其中,#号是注释符号,除了以#号开头的注释内容外,其它内容都是当前项目的配置信息,比如QT       += core guiTARGET = Demo等。

pro 文件可以存储上百条配置信息,每条配置信息由三部分构成:
  1. 前半部分是关键字,也称配置项,用来指明配置信息的含义;
  2. 中间用 +=、-=、= 等数学符号连接配置项和它对应的值;
  3. 后半部分是配置项对应的值,一个配置项可以对应多个值,每个值代表不同的含义。

例如在 QT       += core gui中,Qt是配置项,core gui是该配置项的值,中间用+= 符号连接。下表给大家罗列了一些常用的配置项以及它们各自的含义。

表 1 Qt pro文件常用配置项
配置项 含 义
QT 指定项目中用到的所有模块,默认值为 core 和 gui,中间用 += 符号连接。
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 如果 QT 版本大于 4(Qt5 或更高版本),则需要添加 widgets 模块,该模块包含所有控件类。
TARGET 指定程序成功运行后生成的可执行文件的名称,中间用 = 符号连接。
TEMPLATE 指定如何运行当前程序,默认值为 app,表示当前程序是一个应用程序,可以直接编译、运行。常用的值还有 lib,表示将当前程序编译成库文件。
DEFINES 在程序中新定义一个指定的宏,比如 DEFINES += xxx,如同在程序中添加了 #define xxx 语句。
SOURCES 指定项目中包含的所有 .cpp 源文件。
HEADERS 指定项目中包含的所有 .h 头文件。
FORMS 指定项目中包含的 ui 文件。
INCLUDEPATH 指定头文件的存储路径,例如:INCLUDEPATH += /opt/ros/include
CONFIG 经常对应的值有:
  • release:以 release 模式编译程序;
  • debug:以 debug 模式编译程序;
  • warn_on:编译器输出尽可能多的警告;
  • c++11:启动 C++11 标准支持。
例如 CONFIG += c++11。

根据上表中对各个配置项的讲解,您可以很轻松地搞清楚 Demo.pro 文件中各个配置项的含义,这里不再过多赘述。

上表中,大部分配置项不需要我们手动修改,比如 SOURCES、HEADERS、FORMS 等,当我们添加或者删除项目中的源文件时,Qt 会自动修改这些配置项。有些配置项需要手动修改,比如 QT 配置项,接下来重点给大家讲解 QT 的用法。

QT配置项

前面提到,Qt 根据各个类的功能将它们分到不同的模块,因此程序中要想使用某个类,必须完成两项准备工作:
  1. 引入包含该类的头文件,通常情况下,Qt 中每个类的类名和包含它的头文件的名称是相同的,比如 QWiget 窗口类位于<QWidget>头文件中;
  2. 将该类所属的模块添加到 pro 项目管理文件中。

 

QT 用来指明当前项目中用到的所有模块,它的默认值是 core 和 gui,分别表示引入 Core 模块和 GUI 模块:
每个新创建的 Qt GUI 项目中,都默认包含 Core 模块和 GUI 模块,如果项目中用不到它们,可以使用QT -=删除。例如,删除项目中包含的 GUI 模块,只需在 pro 文件中添加一条配置信息:

QT -= gui


除了 Core 和 GUI 模块外,Qt 还有 SQL(包含操作数据库相关的类)、Widgets(包含构建界面的所有控件类)、Multimedia(包含提供音频、视频等功能的类)等模块,Qt 项目不会自动包含这些模块。例如,项目中用到 SQL 模块中的一些类时,需要在 pro 文件中添加如下配置信息:

QT += sql


那么,当程序中用到某个类时,如何知道它属于哪个模块呢?很简单,先将该类所在的头文件中引入到程序中,然后鼠标选中头文件并按Fn+F1组合键,打开该头文件的使用手册后就可以看到它所属的模块。以程序中使用 QWidget 窗口类为例,先在程序中添加如下语句:
#include <QWidget> 
紧接着,鼠标选中“QWidget”并按Fn+F1组合键,打开下图所示的 QWdiget 类使用手册,可以看到该类所属的模块为 widgets。


图 2 查看类所属的模块

推荐阅读