Qt 工程管理

在这里总结一下关于Qt工程文件管理的一些知识,但愿这个分享能给新手们快速上手。linux

工程目录结构

clipboard.png

Qt工程目录是以工程名为根目录的,Qmake首先从(例如a.pro).pro开始读取配置文件, 而后进行预编译,编译工做。c++

工程类型:

  • 应用程序shell

  • windows

咱们在用Qt作开发的时候,通常就只会作这两类开发,一个是应用程序开发,一个是库(连接库,插件)开发。咱们能够在QtCreator中新建工程的时候能看到这两个首选网络

clipboard.png

是不是应用程序仍是库,实际上是能够在.pro文件中看到一个变量:TEMPLATEapp

clipboard.png

clipboard.png

当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

TEMPLATE 变量决定着咱们的工程是什么来着,若是把这个变量设置成 app,那咱们的工程将会构建成可执行文件,若是这个变量设置成 lib,那咱们的工程将会构建成库文件,下面是它的值还有意义:

  • app: 工程将会被构建成可执行文件

  • lib: 工程将会被构建成库文件

  • subdirs: 工程是一个多工程系项目,里边能够嵌套着多个子工程,孙工程,孙孙工程, 呵呵

例子

TEMPLATE = app

QT

QT这个变量是专门引入Qt各个代码模块的,咱们知道Qt库相很庞大,若是不把他瓜分一个个模块,那么咱们程序将会变得很庞大很笨重(模块其实就是一个个库文件。库文件若是都集成一个模块里边,然而咱们使用的库函数其实都不多,那么咱们岂不就调了qt几个函数却依赖着它这个体积庞大的库?)。为了选择性依赖qt部分的代码库,咱们手动加入须要使用的模块,这样编译程序所依赖Qt模块就是有用的并且体积会没那么庞大,模块就是为了下降咱们程序的体积而设计的。QT 的模块有不少,好比widgets(图形库),networks,等等。咱们须要哪一个库的时候,就是在这个变量中追加的了。例子:

QT += widgets concurrent

TARGET

TARGET是咱们工程的目标输出名字,好比应用程序中的 aaa,库文件中的bbb。TARGET会根据不一样的平台生产对应的后缀名,好比windows下会生产 target.exe/target.dll/target.lib ,linux下 target/target.lib/target.so等等。

DEFINES

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是咱们的头文件包含变量,这个比较简单,看着配置就懂它是干吗得了,很少解释:

HEADERS += \
   controllers/appcontroller.h \
   views/dmovablemainwindow.h \
   views/dleftsidebar.h \
   views/dtoolbar.h \
   views/dfileview.h \
   views/ddetailview.h \
   views/dicontextbutton.h \

SOURCES

HEADERS是咱们的源文件包含变量,这个比较简单,看着配置就懂它是干吗得了,很少解释:

SOURCES += \
   controllers/appcontroller.cpp \
   views/dmovablemainwindow.cpp \
   views/dleftsidebar.cpp \
   views/dtoolbar.cpp \
   views/dfileview.cpp \

RESOURCES

RESOURCES是资源文件包含变量,上面咱们解释过资源文件的概念和使用。

RESOURCES += \
   skin/skin.qrc \
   skin/dialogs.qrc \
   skin/filemanager.qrc \
   themes/themes.qrc

LIBS

LIBS 是用来描述依赖的第三方库文件,咱们在使用第三方库的时候能够经过这个来关联依赖。

LIBS += -lmagic -lffmpegthumbnailer

PWD

PWD是一个目录变量,它是一个只读变量,用来记录当前工程所在的路径。

$$PWD/translations/$${TARGET}_zh_CN.ts

INSTALLS

INSTALLS是一个安装配置变量,qmake会找INSTALLS变量的值,而后根据这些值找到对应的资源,和目标安装路径,而后生成makefile配置(其实在makefile配置里边会有一个install:cmd字段,cmd就是一个shell命令,把选定的资源拷贝到特定目录中去),而后咱们在make install的时候咱们的资源文件就会被拷贝到咱们想放的目录中去。

icon.path = $$INSTALLDIR  //INSTALLDIR这个是自定义的变量
icon.files = skin/images/$${TARGET}.svg
INSTALLS += icon

SUBDIRS

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是在作国际化的时候用到的变量,咱们经过这个变量指定国际化文件。

TRANSLATIONS += $$PWD/translations/$${TARGET}.ts \
   $$PWD/translations/$${TARGET}_zh_CN.ts

当咱们指定好国际化翻译文件后,结合lupdate,linguist,lrelease这三个工具分别进行更新国际化文本(.ts),翻译文本(.ts),发布国际化二进制文本(.qm文件)

PKGCONFIG

PKGCONFIG这个变量是Linux系统下独有的变量,也就是说它值适合用在linux下,它的做用个LIBS差很少同样。只是使用这个变量以前咱们得确保好咱们系统是否已经安装了pkg-config这个工具。由于这个变量其实就是qmake经过这个变量的值,调用pkg-config来匹配到对应的连接库路径,而后才能正常经过编译依赖。最后要在CONFIG变量中追加ling_pkgconfig这个值。

CONFIG

CONFIG变量我的理解为全局配置变量,它就比如跟cmake的配置设置项同样,咱们能够配置当前程序的编译环境,好比开启c++11,编译debug版本,release版本,等等 ,都是在这个变量中进行控制的。

编译配置

引入连接库

使用pkgconfig

工程变量调试调试

模块化代码管理

多工程管理技巧

安装配置

后面内容留着精细推敲,先开坑。

相关文章
相关标签/搜索