當進行中大型qt專案研發時,在各個子專案的pro檔案中經常會出現重複配置。為了處理這個問題,qt提供了另外乙個專案配置檔案:pri檔案。在pri檔案裡,可以編寫用於各個子專案的公共變數,還可以配置各種公共的編譯選項、配置各種公共路徑。本節將以常用關鍵字(見表2-3)為線索,介紹pri檔案的各種用途。
表2-3 pro和pri檔案常用關鍵字
關鍵字(或關鍵字型別)
含義
include
在pro中引入某pri檔案
環境變數
在pri中使用環境變數
變數在pri中定義與使用變數
函式pri中提供的常用函式
unix/win32
用來定義在不同平台下構建專案時的配置項分支
defines
在pri中定義巨集
config
專案的配置引數
qmake_cxxflags
配置編譯標誌
下面分別進行介紹。
1.include
include用來在pro或pri中引入某pri檔案。
語法:include (pri檔案全路徑名)
比如:include ($(traindevhome)/src/gui_base.pri)
注意:
(1)include後面有空格。用括號把pri檔名括起來。
(2)pri檔案路徑中的目錄分隔符用「/」,請不要使用「\」。
(3)pri檔案只能被另乙個pri檔案或pro檔案引用,不能在.h或.cpp檔案中用#include語句引用pri檔案。
2.環境變數
有時在構建專案時會碰到如下問題:將專案編譯為32位還是64位,編譯成debug版還是release版等。這可以通過定義環境變數來解決。那麼,在pri檔案中怎樣使用這些環境變數呢?使用環境變數的語法如下:
$$(環境變數名稱)
下面看一下對環境變數traindevhome的使用。該環境變數分別用來描述gui_base.pri的檔案路徑以及ks02_04專案的object_dir配置項的值。
**清單2-14
include ($$(traindevhome)/src/gui_base.pri)
objects_dir = $$(traindevhome)/obj/chapter02/ks02_04
3.變數與環境變數
除了環境變數之外,有時候為了方便還可以自定義一些變數。比如,qt的isempty()函式不識別環境變數,因此可以通過變數來解決這個問題(見**清單2-14)。
**清單2-1
4devhome = $$(traindevhome)
isempty(devhome)
isempty()函式不識別環境變數,但它可以識別自定義的變數,所以在**清單2-14中定義了devhome變數。這樣isempty()就可以通過devhome變數間接對traindevhome這個環境變數的取值進行判斷。如果未定義traindevhome環境變數,編譯器就會報錯。
變數的使用語法同環境變數不同,使用變數時不加括號。 變數的使用語法:$$變數名。比如:
tempdir = $$(traindevhome)/obj/chapter02/ks02_04
objects_dir = $$tempdir
對環境變數和變數的使用做一下說明:
(1)在一行語句中,所引用的變數或環境變數的總個數不能超過1個。
錯誤的寫法:
chapter = chapter02
tempdir = (t
rain
devh
ome)
/obj
/'>(traindevhome)/obj/
chapter/ks02_04
正確的寫法:
tempdir = $$(traindevhome)/obj/chapter02/ks02_04
(2)使用環境變數的語法跟使用變數的語法不同(環境變數名要用括號)。
環境變數語法: $$(環境變數名)
變數語法: $$變數名
4.函式
在**清單2-14中,介紹了isempty()函式、error()函式,實際上qt還提供了一些其他函式。
1)isemtpy()
isemtpy()函式用來判斷乙個變數是否為空值,比如:
devhome = $$(traindevhome)
isempty(devhome)
2)equals(a, b)
equals(a, b)函式用來判斷某個變數的值是否與指定值相等。**清單2-15表示如果buildtype的值是debug則執行標號①處的**。
**清單2-15
buildtype = $$(trainbuildtype)
equals(buildtype, debug)
3)error()
error()函式用來輸出錯誤資訊,並終止當前構建過程,比如:
isempty(devhome)
4)contains(x, y)
contains(x, y)函式用來判斷乙個變數x是否包含字串y。**清單2-16表示如果train_qmakespec的值包含「hpux.」,則執行花括號中的配置。
**清單2-16
contains(train_qmakespec, hpux.* )
5)unix/win32
unix和win32用來配置不同平台下的配置項。如**清單2-17中linux、unix平台均使用unix配置項,而windows平台使用win32配置項。建議所有的
}#win32下宣告使用預編譯標頭檔案
win32
6)defines
defines用來在pro、pri檔案中定義巨集。這些巨集可以在源**中使用,比如**清單2-18中標號①處、標號②處、標號③處定義的unix、__unix、win32、train_64。
**清單2-18
#unix下編譯設定
unix
#win32下編譯設定
win32
equals(buildbit,64)
注意:標號①處、標號②處、標號③處的defines後面的*=表示累加。
**清單2-18中定義的unix、__unix、win32、train_64,可以在源**中使用。比如:
// dialog.cpp
#ifdef __unix
...#endif
#ifdef train_64
...#endif
7)config
config配置項在pri中與pro中用法一樣。config常用的選項有:
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
qmake_cxxflags用來為編譯器指示一些編譯標誌,比如:
# 去掉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 5/pyqt 5實戰指南》目錄
檔案系統知識點
1 堆檔案 類似資料庫的堆表,記憶體管理中的堆,記錄是無序儲存的,要訪問乙個記錄需要知道其位址 位移 mds的masterbin就是這種檔案,自己維護metadata pointer table 2雜湊檔案 記錄按照key雜湊到塊,hash key n,n是總塊數。然後存入相應塊裡,如果塊滿了,就插...
Python 檔案知識點總結
open test.txt 檔案存於執行檔案所在的目錄時 open 子目錄 test.txt 檔案存於執行檔案所在目錄的子目錄時 open e test.txt 檔案存於任何位置時 基本的開啟方式 開啟模式 執行操作 r 以唯讀方式開啟檔案 預設 w 以寫入的方式開啟檔案,會覆蓋已存在的檔案 x 以...
檔案的小知識點
import traceback import os os.path.splitext file name 0 獲取檔案的字首 os.path.splitext file name 1 獲取檔案的字尾 注意 如果檔案編碼是 utf 8 需要使用notepad 去掉檔案的bom頭 r模式 開啟檔案只用...