在這裏總結一下關於Qt工程文件管理的一些知識,但願這個分享能給新手們快速上手。linux
Qt工程目錄是以工程名爲根目錄的,Qmake首先從(例如a.pro).pro開始讀取配置文件, 而後進行預編譯,編譯工做。c++
應用程序shell
庫windows
咱們在用Qt作開發的時候,通常就只會作這兩類開發,一個是應用程序開發,一個是庫(連接庫,插件)開發。咱們能夠在QtCreator中新建工程的時候能看到這兩個首選網絡
是不是應用程序仍是庫,實際上是能夠在.pro文件中看到一個變量:TEMPLATEapp
當TEMPLATE = app 時,咱們構建的程序最後是生成可執行文件;當TEMPLATE = lib 時,咱們構建的程序最後是庫文件。ide
windows 平臺svg
app: .exe文件模塊化
lib: .lib(靜態庫)或者是.dll(動態庫)文件函數
linux 平臺
app: 二進制可執行文件
lib: .lib(靜態庫)或者是.so(動態庫)文件
qt的資源文件管理使用的是.qrc文件。爲啥要使用資源文件?咱們直接把資源文件放到一個目錄,而後程序去讀取不就好了嘛?一開始我也是很納悶,後來作開發久了才發現裏邊是有它的緣由的。首先咱們先簡單瞭解一下qrc文件的規則是怎麼樣的:
dialog.qrc
<RCC> <qresource prefix="/images"> <file>dialogs/images/check_focus.png</file> <file>dialogs/images/dark_check_checked_hover.png</file> <file>dialogs/images/dark_check_checked.png</file> <file>dialogs/images/dark_check.png</file> <file>dialogs/images/dark_close_small_hover.png</file> <file>dialogs/images/dark_close_small_normal.png</file> <file>dialogs/images/dark_close_small_press.png</file> <file>dialogs/images/dark_minimise_small_hover.png</file> <file>dialogs/images/dark_minimise_small_normal.png</file> <file>dialogs/images/dark_minimise_small_press.png</file> <file>dialogs/images/light/checkbox-checked-hover.png</file> <file>dialogs/images/light/checkbox-checked.png</file> <file>dialogs/images/light/checkbox-focus.png</file> <file>dialogs/images/light/checkbox-hover.png</file> <file>dialogs/images/light/checkbox-unchecked.png</file> <file>dialogs/images/light/window_close_hover.png</file> <file>dialogs/images/light/window_close_normal.png</file> <file>dialogs/images/light/window_close_press.png</file> <file>dialogs/images/light/window_min_hover.png</file> <file>dialogs/images/light/window_min_normal.png</file> <file>dialogs/images/light/window_min_press.png</file> <file>dialogs/images/user-trash-full-opened.png</file> <file>dialogs/images/dialog_warning_64.png</file> <file>dialogs/images/share_password.png</file> </qresource> <qresource prefix="/qss"> <file>dialogs/qss/dark.qss</file> <file>dialogs/qss/light.qss</file> </qresource> </RCC>
上面的是一個qrc配置文件內容,其實裏邊就是一個xml配置文件,以<RCC></RCC>標籤爲根節點進行資源描述。咱們程序裏邊要使用這些資源的時候很方便,不須要關心你要用的資源在哪一個相對目錄或者絕對目錄,固然咱們要了解按着怎麼樣格式去讀取咱們想要的資源文件的。
c++裏邊讀取資源 ":/prefix/file"
qml裏邊讀取資源 "qrc:/prefix/file"
對的,就兩個格式,分別是在c++ 代碼讀取和qml代碼讀取的方式。prefix其實就是<qresource>標籤裏邊的prefix屬性值,而file就是<file>標籤的內容。
瞭解了.qrc結構以後,咱們簡單瞭解一下qrc資源文件和本身讀取相對路徑或者絕對路徑資源文件的區別:
.qrc 資源文件
.qrc資源文件在構建項目的時候會把資源編譯到當前工程代碼中,它是在qmake的時候,qmake會去掃描全部的qrc資源文件,而後把文件內容根據qrc配置定義成一大堆全局資源宏,宏的值其實就是資源文件的二進制內容了。這樣程序在經過規則字符串找到資源文件的宏匹配,把資源內容讀取出來。也就是說,咱們的資源文件都被編譯到了代碼當中去了,成爲了一個常量,不可修改替代的資源(重點)。
相對路徑或者絕對路徑讀取資源
其實相對路徑或者絕對路徑讀取資源咱們很是熟悉,它就是咱們常常經過IO操做讀取本地或者網絡上的資源。這裏就很少解釋了。
在這裏咱們應該很清晰使用qrc資源管理和本地(非本地)資源管理的區別了。簡單來講就是qrc資源管理是把資源編譯到程序當中去了,編譯後不可修改,只能讀取使用的資源。本地(非本地)資源就是把資源放到一個本身設定的目錄,而後經過I/o操做讀取資源,資源隨時可修改。至於咱們何時用qrc管理資源,何時有本地資源,就取決於需求問題了,好比qrc資源文件是有大小限制的,超過限定大小(具體多大忘了)了是沒法經過編譯的,可是咱們又想一些又小並且不須要作任何修改的資源不被作修改,這時候能夠考慮把資源文件放到qrc中一塊兒編譯到程序中去。然而有些配置文件須要常常修改的,動態讀取的,這時候咱們的文件就不該該放到qrc裏邊去了,由於放進去了,咱們只能讀取而不能作任何修改。
在工程文件當中,咱們對工程的控制基本都是對變量的控制,這些變量能夠是自定義的,也能夠是Qt內置的,內置的變量決定這工程實質性編譯工做。這裏介紹一些經常使用的變量和解釋(好了這裏就不按着官方文檔的套路給你們介紹了)。
TEMPLATE 變量決定着咱們的工程是什麼來着,若是把這個變量設置成 app,那咱們的工程將會構建成可執行文件,若是這個變量設置成 lib,那咱們的工程將會構建成庫文件,下面是它的值還有意義:
app: 工程將會被構建成可執行文件
lib: 工程將會被構建成庫文件
subdirs: 工程是一個多工程系項目,裏邊能夠嵌套着多個子工程,孫工程,孫孫工程, 呵呵
例子
TEMPLATE = app
QT這個變量是專門引入Qt各個代碼模塊的,咱們知道Qt庫相很龐大,若是不把他瓜分一個個模塊,那麼咱們程序將會變得很龐大很笨重(模塊其實就是一個個庫文件。庫文件若是都集成一個模塊裏邊,然而咱們使用的庫函數其實都不多,那麼咱們豈不就調了qt幾個函數卻依賴着它這個體積龐大的庫?)。爲了選擇性依賴qt部分的代碼庫,咱們手動加入須要使用的模塊,這樣編譯程序所依賴Qt模塊就是有用的並且體積會沒那麼龐大,模塊就是爲了下降咱們程序的體積而設計的。QT 的模塊有不少,好比widgets(圖形庫),networks,等等。咱們須要哪一個庫的時候,就是在這個變量中追加的了。例子:
QT += widgets concurrent
TARGET是咱們工程的目標輸出名字,好比應用程序中的 aaa,庫文件中的bbb。TARGET會根據不一樣的平臺生產對應的後綴名,好比windows下會生產 target.exe/target.dll/target.lib ,linux下 target/target.lib/target.so等等。
DEFINES是一個全局宏控制。這個是一個頗有用的變量。咱們在寫代碼的時候,能夠找到DEFINES裏邊的全局宏定義。 其實 qmake 會去檢索DEFINES這個變量值,而後在最後生成makefile的時候將這些宏做爲make編譯的宏參數,這樣程序就可使用這些宏定義了。簡單說一下這些宏定義的使用場景:若是在作一個跨平臺的應用開發,咱們又想一個項目代碼走遍全平臺,那這時候就能夠經過對編譯環境來選擇添加DEFINES的內容。好比:
windows平臺編譯代碼: DEFINES += USE_WINDOWS_LIBS
linux平臺編譯代碼:DEFINES += USE_LINUX_LIBS
而後咱們就能夠在程序裏邊判斷在哪一個宏定義作哪些事情了。例子:
isEqual(ARCH, sw_64) | isEqual(ARCH, mips64) | isEqual(ARCH, mips32) { DEFINES += ARCH_MIPSEL #use classical file section mode DEFINES += CLASSICAL_SECTION DEFINES += AUTO_RESTART_DEAMON DEFINES += LOAD_FILE_INTERVAL=150 DEFINES += DDE_COMPUTER_TRASH }
HEADERS是咱們的頭文件包含變量,這個比較簡單,看着配置就懂它是幹嗎得了,很少解釋:
HEADERS += \ controllers/appcontroller.h \ views/dmovablemainwindow.h \ views/dleftsidebar.h \ views/dtoolbar.h \ views/dfileview.h \ views/ddetailview.h \ views/dicontextbutton.h \
HEADERS是咱們的源文件包含變量,這個比較簡單,看着配置就懂它是幹嗎得了,很少解釋:
SOURCES += \ controllers/appcontroller.cpp \ views/dmovablemainwindow.cpp \ views/dleftsidebar.cpp \ views/dtoolbar.cpp \ views/dfileview.cpp \
RESOURCES是資源文件包含變量,上面咱們解釋過資源文件的概念和使用。
RESOURCES += \ skin/skin.qrc \ skin/dialogs.qrc \ skin/filemanager.qrc \ themes/themes.qrc
LIBS 是用來描述依賴的第三方庫文件,咱們在使用第三方庫的時候能夠經過這個來關聯依賴。
LIBS += -lmagic -lffmpegthumbnailer
PWD是一個目錄變量,它是一個只讀變量,用來記錄當前工程所在的路徑。
$$PWD/translations/$${TARGET}_zh_CN.ts
INSTALLS是一個安裝配置變量,qmake會找INSTALLS變量的值,而後根據這些值找到對應的資源,和目標安裝路徑,而後生成makefile配置(其實在makefile配置裏邊會有一個install:cmd字段,cmd就是一個shell命令,把選定的資源拷貝到特定目錄中去),而後咱們在make install的時候咱們的資源文件就會被拷貝到咱們想放的目錄中去。
icon.path = $$INSTALLDIR //INSTALLDIR這個是自定義的變量 icon.files = skin/images/$${TARGET}.svg INSTALLS += icon
SUBDIRS 是在TEMPLATE值爲subdirs的時候有效。這個是一個多工程管理變量。咱們能夠經過SUBDIRS來增長多個子項目。
SUBDIRS += \ dde-file-manager \ dde-file-manager-daemon \ dde-file-manager-lib \ dde-file-manager-plugins \ usb-device-formatter
TRANSLATIONS是在作國際化的時候用到的變量,咱們經過這個變量指定國際化文件。
TRANSLATIONS += $$PWD/translations/$${TARGET}.ts \ $$PWD/translations/$${TARGET}_zh_CN.ts當咱們指定好國際化翻譯文件後,結合lupdate,linguist,lrelease這三個工具分別進行更新國際化文本(.ts),翻譯文本(.ts),發佈國際化二進制文本(.qm文件)
PKGCONFIG這個變量是Linux系統下獨有的變量,也就是說它值適合用在linux下,它的做用個LIBS差很少同樣。只是使用這個變量以前咱們得確保好咱們系統是否已經安裝了pkg-config這個工具。由於這個變量其實就是qmake經過這個變量的值,調用pkg-config來匹配到對應的連接庫路徑,而後才能正常經過編譯依賴。最後要在CONFIG變量中追加ling_pkgconfig這個值。
CONFIG變量我的理解爲全局配置變量,它就比如跟cmake的配置設置項同樣,咱們能夠配置當前程序的編譯環境,好比開啓c++11,編譯debug版本,release版本,等等 ,都是在這個變量中進行控制的。
後面內容留着精細推敲,先開坑。