版权声明
----------------------------------------------------------------
作者: 女儿叫老白
转载请注明出处!
网页版课程源码 提取码:1uy7
引言
----------------------------------------------------------------
在前面的章节中我们介绍了pro文件的常用配置。当我们进行项目研发时,在各个子项目的pro中经常会出现重复配置,为了处理这种问题,Qt提供了另外一个项目配置文件:pri文件。在pri文件里,我们可以编写公共的变量给各个子项目用,还可以配置各种编译选项、配置各种路径。在本节中,我们将讨论一下pri文件都有哪些作用。
 
正文
----------------------------------------------------------------
在本节中,我们将以常用关键字为线索,介绍pri文件所能起到的各种功能。我们准备为大家介绍如下关键字: 
表02-05-01
| 关键字 | 含义 | 
| include | 在pro中引入其他的pri文件 | 
| 环境变量 | 在pri中使用环境变量 | 
| 变量 | 在pri中定义与使用变量 | 
| 函数 | pri中提供的常用函数 | 
| unix/win32 | 配置不同平台下的编译配置项 | 
| DEFINES | 在pri中定义宏 | 
| CONFIG | 项目的配置参数 | 
| QMAKE_CXXFLAGS | 配置编译警告 | 
现在,我们来分别进行介绍:
1,  include --- 在pro中引入其他的pri文件
    pri文件编写完成之后,可以在项目文件(pro文件)或者其他pri文件中引用。
语法:include  (pri文件全路径名)   
比如:
| 1.     | include  ($(TRAINDEVHOME)/src/gui_base.pri) | 
 
注:
| 1.     请注意include后面有空格。 2.     pri文件路径中的目录分隔符要用"/",请不要使用"\"。 3.     pri文件只能被另一个pri文件或pro文件引用,不能在.h或.cpp文件中用#include语句进行引用。 | 
 
2,  环境变量 --- 在pri中使用环境变量
    有时候,在项目编译时我们会用到一些环境变量。比如,将项目编译为32位还是64位,编译成debug版还是release版等等。那么,在pri文件中我们怎样使用这些环境变量呢?
    语法: $$(环境变量名称)
    比如:
| 1.       2.       | include  ($$(TRAINDEVHOME)/src/gui_base.pri) OBJECTS_DIR   = $$(TRAINDEVHOME)/obj/chapter02/ks02_04 | 
    在上述例子中,我们用到了TRAINDEVHOME这个环境变量值,分别用来描述gui_base.pri的文件路径以及ks02_04项目的OBJECT_DIR配置项的值。
 
3  变量与环境变量 --- 在pri中定义与使用变量、环境变量
    除了环境变量之外,有时候为了方便还可以自己定义一些变量。
    比如,Qt的isEmpty()函数不识别环境变量,因此我们可以这样做:
| 1.       2.       3.       4.       | DEVHOME   = $$(TRAINDEVHOME) isEmpty(DEVHOME)   {     error('TRAINDEVHOME'环境变量必须被定义.) } | 
    在上述代码中,因为isEmpty()函数不识别环境变量但是可以识别我们定义的变量,所以我们定义了DEVHOME变量,这样isEmpty()就可以根据TRAINDEVHOME这个环境变量的取值进行判断,如果未定义TRAINDEVHOME环境变量,那么就会报错。
    使用语法同系统环境变量不同,变量名不用括号。 
语法:$$变量名
| 1.       2.       | TEMPDIR  = $$(TRAINDEVHOME)/obj/chapter02/ks02_04 OBJECTS_DIR   = $$TEMPDIR | 
请注意:
1)  在一行语句中,所引用的变量或环境变量的个数不能超过1个,
错误的写法:
| 1.       2.       | CHAPTER   = chapter02 TEMPDIR = $$(TRAINDEVHOME)/obj/$$CHAPTER/ks02_04 | 
正确的写法:
| 1.     | TEMPDIR = $$(TRAINDEVHOME)/obj/chapter02/ks02_04 | 
 
2) 使用环境变量的语法跟使用变量的语法不同(环境变量名要用括号):
    环境变量: $$(环境变量名)
变量:     $$变量名
 
4, 函数  --- pri中提供的常用函数
    在上面的示例中,我们介绍了isEmpty()函数、error()函数,实际上Qt还提供了一些其他函数:
    1)  isEmtpy()  
用来判断一个变量是否为空值,比如:
| 1.       2.       3.       4.       | DEVHOME   = $$(TRAINDEVHOME) isEmpty(DEVHOME) {     error('TRAINDEVHOME'环境变量必须被定义.) } | 
 
2)  equals(a, b)
    判断某个变量的 值是否与指定值相等,比如:
| 1.       2.       3.       4.       5.       | BUILDTYPE   = $$(TRAINBUILDTYPE) equals(BUILDTYPE, debug){     CONFIG += debug     CONFIG -= release } | 
    
    3)  error()
    用来输出错误信息,并终止当前命令,比如:
| 1.       2.       3.       | isEmpty(DEVHOME)   {         error('TRAINDEVHOME'环境变量必须被定义.) } | 
    
    4)  contains(x, y)
    用来判断一个变量x是否包含字符串y,比如下面的配置表示如果TRAIN_QMAKESPEC变量包含” hpux.* ”,则执行括号中的配置:
| 1.       2.       3.       4.       5.       | contains(TRAIN_QMAKESPEC, hpux.*   ) {     # HPUX下全面支持C++     QMAKE_CXXFLAGS *= -Aa     LIBS += -lrt } | 
 
5, unix/win32  --- 配置不同平台下的编译配置项
| 1.       2.       3.       4.       5.       6.       7.       8.       9.       | unix{     contains( TRAIN_QMAKESPEC, g++ ) {         CONFIG *= precompile_header     } } #WIN32下声明使用预编译头文件 win32{     CONFIG *= precompile_header } | 
 
注:
| 1.     linux也使用unix配置。 2.     所有的左括号“{”,跟起始配置在同一行,不要换行。 | 
 
6, DEFINES --- 在pri中定义宏
    可以根据需要定义宏定义,这些宏定义可以在源代码中使用,比如
| 1.       2.       3.       4.       5.       6.       7.       8.       9.       10.    11.    12.    13.    | #UNIX下编译设置 unix{     #表示unix或linux操作系统     DEFINES *= unix  __unix  } #WIN32下编译设置 win32{     #表示WINDOWS操作系统     DEFINES *= WIN32 } equals(BUILDBIT,64){     DEFINES *= TRAIN_64 } | 
    在上述代码中,在pri中定义的宏定义" unix"、" __unix "、"WIN32"、"TRAIN_64"都可以在代码中使用,比如:
| 1.       2.       3.       4.       5.       6.       7.       | #ifdef    __unix     …… #endif   #ifdef  TRAIN_64     …… #endif | 
 
注:
| 1.   DEFINES 后面是 *=,(就是 星号=),用来表示累加。 | 
 
7, CONFIG --- 项目的配置参数
    CONFIG配置项在pri中与pro中用法一样。
    常用的参数:
    CONFIG  += console qt debug release thread warn_on
1)  console
表示本应用是命令行程序,可以启动一个终端(命令行)。
2)  qt
表示本应用要加载Qt的库,链接时要链接qt类库。
3)  debug/release
表示程序是debug版本还是release版本。
4)  thread
表示程序是否启用多线程,如果没有thread选项,那么程序无法使用多线程。
5)  warn_on
表示是否显示编译警告。个人建议开启,因为有些编译警告还是很重要的。如果不关注就可能导致程序运行时异常。
 
8, QMAKE_CXXFLAGS  --- 配置编译警告
    用来为编译器指明一些处理标志,比如:
|   1.       2.       3.       4.       | # 去掉strcpy等编译警告 QMAKE_CXXFLAGS   *= -wd499   # ui 生成的文件使用 utf-8 编码,编译时产生4819 警告,因此去掉 QMAKE_CXXFLAGS   *= -wd4819 | 
 
结语
----------------------------------------------------------------
在进行项目开发时经常用到pri文件。当然,如果您仅仅在编写一个独立的exe模块,pri文件可能不会发挥太大作用,因为可以把pri中的配置项直接编写到pro文件中。但是小编还是建议大家养成习惯,编码时要做到标准化。比如建立一套pri文件,这样在建立新项目时将会非常方便,这些内容我们将在下一节介绍。现在,我们先来回顾一下本节的注意事项:
    1, pri文件路径中的目录分隔符要用"/",请不要使用"\"。
    2, pri文件只能被pro文件或另一个pri文件引用。
3, 使用环境变量的语法跟使用变量的语法不同:
    环境变量: $$(环境变量名)
变量:     $$变量名
    4, 在pro或pri中,Qt提供了一些函数来方便判断或者输出信息,比如 isEmpty()、error()等。
    5, 在使用CONFIG的配置项进行判断时,所有的左括号“{”,跟起始配置在同一行,不要换行。
    6, 在pri中定义的宏可以在代码中使用
    好了,总结就到这里,祝大家编程愉快。
----------------------------------------------------------------
《Qt入门与提高-GUI产品开发》目录请添加链接描述
上一节:KS02-04 pro文件常用配置
下一节:KS02-06 一劳永逸:引入pri体系