在这里总结一下关于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版本,等等 ,都是在这个变量中进行控制的。
后面内容留着精细推敲,先开坑。