• Qt开发之路--模块化设计.pri文件



    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    QT pro文件和pri文件的区别

    pro文件是一个工程文件,就是可以独立执行的项目的最高首领;

    pri文件比pro文件简单的多,单纯的为了编者逻辑上的区分或者思路的厘清,不具备单独执行的条件

    一般pri文件包含:

    HEADERS += \
       page/systemsetup.h \
       
     
    SOURCES += \
       page/systemsetup.cpp \
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    也就是其头文件和源文件;

    其实用pri文件的地方完全可以用pro文件代替,只不过前者简单实用;

    Chapter1 Qt开发之路–模块化设计.pri文件

    原文链接:https://blog.csdn.net/weixin_43229139/article/details/110874907

    一:.pri文件简介

    i 是?包含(include)的首字母。类似于C、C++中的头文件,我们可以把 *.pro 文件内的一部分内容单独放到一个 *.pri 文件内,然后包含进来。

    例如,我们将源文件的设置独立出来,放到propriprfprl.pri文件内:

    SOURCES += main.cpp/
            widget.cpp
    HEADERS  += widget.h
    FORMS    += widget.ui
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这时,我们的 propriprfprl.pro 文件就可以简化为:

    TEMPLATE = app
    CONFIG += QT
    QT += core gui
    
    TARGET = propriprfprl
    include(propriprfprl.pri)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果一个大点的项目,含有多个*.pro文件呢,这些pro需要有些共同的设置或需要的文件,这时就很有必要了。

    二:通过.pri模块化设计

    对于QT项目,默认情况下所有的文件都是在同一个文件夹下进行开发的,当做一个项目规模相对较大的时候文件很多导致维护及其困难,所以pri对文件进行模块化开发至关重要,pri进行模块化无非就是将相同业务逻辑的代码放到同一个文件夹下进行管理。
    当你的工程文件变多时,你的工程逻辑结构会变得相对复杂,这时点开你的工程节点会发现节点下都是这样长长的一串,什么模块的文件都挤在一个节点下,很臃肿。如下图模块化前后对比:
    在这里插入图片描述
    在这里插入图片描述

    第一步:到项目根目录下新建你自己的业务逻辑的文件夹,Dialog、Widget文件夹如下图:
    在这里插入图片描述
    第二步:将相同的功能文件移动到对应的文件夹中。
    在这里插入图片描述
    在这里插入图片描述
    第三步:在新建的文件夹下新建 " .pri " 文件,新建.pri文件名称规则(文件夹名称+.pri),新建.pri文件后,手动添加内容,或者根据第五步添加。
    在这里插入图片描述
    第四步:在项目根目录的.pro文件中添加如下内容。
    INCLUDEPATH
    include

    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = TestQt
    TEMPLATE = app
    
    SOURCES += main.cpp\
            mainwindow.cpp
    HEADERS  += mainwindow.h
    FORMS    += mainwindow.ui
    
    RESOURCES += \
        image.qrc
    DISTFILES +=
    
    INCLUDEPATH += $$PWD/Dialog  # 工程编译时,会去INCLUDEPATH列表下的目录搜索文件
    include ($$PWD/Dialog/Dialog.pri) # include()包含的文件会显示在工程结构图中
    
    INCLUDEPATH += $$PWD/Widget  # 工程编译时,会去INCLUDEPATH列表下的目录搜索文件
    include ($$PWD/Widget/Widget.pri) # include()包含的文件会显示在工程结构图中
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    第五步:qmake后,分别右键Dialog、Widget添加对应文件夹下的文件。.pri文件内容如下:
    Dialog.pri文件:

    FORMS += \
        $$PWD/dialogone.ui \
        $$PWD/dialogtwo.ui
    
    HEADERS += \
        $$PWD/dialogone.h \
        $$PWD/dialogtwo.h
    
    SOURCES += \
        $$PWD/dialogone.cpp \
        $$PWD/dialogtwo.cpp
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Widget.pri文件:

    FORMS += \
        $$PWD/widgetone.ui \
        $$PWD/widgettwo.ui
    
    HEADERS += \
        $$PWD/widgetone.h \
        $$PWD/widgettwo.h
    
    SOURCES += \
        $$PWD/widgetone.cpp \
        $$PWD/widgettwo.cpp
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第六步:效果图
    在这里插入图片描述

    三:结尾

    写好一个.pro文件非常有助于你去梳理项目的结构组成,一个良好的框架,也往往对开发维护有着事半功倍的效果。

    Chapter2 Qt开发大型项目时,通过.pri文件将众多文件按功能模块分类显示

    原文链接

    在这里插入图片描述
    后期我们要维护代码的时候,要找某个功能的代码,就可以先找到对应功能模块的目录,然后在该目录下找对应的类文件即可。这可是经过验证的提高开发效率的技巧!

    Chapter3 Qt中多pro与多pri合作编程($$$)

    原文链接:https://blog.csdn.net/u014597198/article/details/52679142

    ri文件跟pro文件没有本质区别,都是起到包含路径等作用,区别在于pro文件是主要文件,pri是附属文件。

    要是项目相对来说比较复杂,比如多平台开发时,需要用到多pri与pro共同合作,当然也可以编辑成静态库或者动态库的形式,现在讲一下如何实现多pri。

    一个pro可以包含多个pri,例如:
    include(win32.pri)
    include(macx.pri)
    include(ios.pri)
    include(android.pri)

    看两个实际项目中pro与pri用法,希望可以对您架构设计提供了一定的参考价值。

    实例1:(按照功能来设计架构)
    在这里插入图片描述

    实例2:(按照平台和主要功能进行架构)
    在这里插入图片描述

    Chapter4 Qt 项目文件Pri详解($$$)

    原文链接:https://blog.csdn.net/thanklife/article/details/131021462

    在Qt项目中,pri文件(.pri)是一种类似于makefile的文件,用于定义Qt项目中的编译规则。通常可以用pri文件来配置Qt库、头文件、源文件、链接库等信息,这样可以把这些信息定义在一个文件中,避免在每个工程中都进行重复配置,提高了代码的可重用性。

    对于Qt项目来说,pri文件是非常重要的,因为它可以方便地进行模块管理,让工程的结构更加清晰。如果你需要在Qt项目中添加新的模块或者新的第三方库,你可以在pri文件中添加相关的信息。同时,pri文件还可以使代码编译更高效,这是因为它会根据不同平台自动选择最优化的编译器和编译选项。

    在使用pri文件时,你应该学会如何编写和使用自己的pri文件,以便能够根据自己的需要进行自定义配置。同时,你也可以将已经写好的pri文件分享给其他人使用,以提高整个团队的开发效率。在Qt Creator编辑器中,可以通过右键单击项目文件夹,选择“Add New…”菜单,选择“Add Existing Files or Directory…”,然后选择对应的pri文件添加到项目中。

    需要注意的是,pri文件虽然非常强大,但同时也需要谨慎使用。如果错误地配置pri文件,会导致代码无法正常编译运行,因此在修改pri文件时一定要慎重。

    一、Pri文件简介

    在Qt中,Pri文件是一种项目文件,用于将C++代码、JavaScript文件、资源文件等链接在一起,并生成可执行文件。Pri文件中可以定义编译规则、链接规则、生成规则、部署规则等等,通过使用不同的变量和函数,来实现各种复杂的构建流程和部署流程。

    Pri文件是基于Makefile语法的,因此需要使用一定的Makefile知识。同时,Qt Creator集成开发环境及其命令行工具Qt Build System(qbs)可以方便地生成Pri文件并进行构建,使得在不需要编写完整的Makefile的情况下进行快速开发和构建成为可能。

    二、Pri文件编写基础

    Pri文件的编写离不开变量、函数和条件判断等基础语法。

    1. 变量的定义

    Pri文件中的变量可以是预定义的系统变量,如$$PWD表示Pri文件所在的目录;也可以是用户自定义的变量,如SRC_DIR表示源文件目录。变量定义的语法是:

    VARIABLE_NAME = variable_value
    
    • 1

    其中,VARIABLE_NAME为变量名,variable_value为变量的值。在变量的值中,可以嵌入其他变量,例如:

    SRC_DIR = $$PWD/src
    OBJ_DIR = $$PWD/obj
    OBJECTS_DIR = $$OBJ_DIR/$$TARGET
    
    • 1
    • 2
    • 3

    其中,$$TARGET表示生成文件的目标类型,可以是exe、dll、plugin等。

    2. 函数的使用

    Pri文件中的函数可以大大简化复杂的构建流程,例如文件搜索、文件生成、文件拷贝、库链接等等。

    函数的语法是:

    FUNCTION_NAME(arg1, arg2, ...)
    
    • 1

    其中,FUNCTION_NAME为函数名,arg1、arg2等为函数的参数。常用的函数包括:

    files:用于搜索指定目录下的所有文件
    subdirs:指定当前目录下的子目录
    target.sources:为目标文件指定源文件
    target.depends:指定目标文件所依赖的文件
    target.commands:为目标文件指定编译命令、链接命令等
    target.path:指定目标文件生成的路径
    target.link:为目标文件指定需要链接的库文件以及链接命令等
    例如:

    LIBS += -lfoo
    target_link($$TARGET, $$LIBS)
    
    • 1
    • 2

    其中,target_link是一个自定义的函数,用于将
    LIBS中指定的库链接到TARGET中。

    1. 条件判断
      在Pri文件中,可以根据具体情况对不同的操作进行条件判断,例如:
    win32:LIBS += -lwsock32
    else:LIBS += -lsocket -lnsl
    
    • 1
    • 2

    其中,win32表示在Windows平台下进行操作,else表示在其他平台下进行操作。

    三、Pri文件高级应用

    在掌握了基础的Pri文件语法之后,Pri文件可以进行更多复杂的编译任务。

    1. 如何指定编译器

    在Pri文件中,可以通过设置QMAKE_CXX和QMAKE_CC变量来指定编译器:

    QMAKE_CXX = g++
    QMAKE_CC = gcc
    
    • 1
    • 2

    2. 如何生成动态库和静态库

    在Pri文件中,可以通过target.commands指定动态库和静态库的生成规则:

    lib.path = /usr/lib
    lib.name = foo
    lib.files = source1.cpp source2.cpp
    lib.commands = $$QMAKE_CXX -shared -o $$lib.target $$OBJECTS
    
    • 1
    • 2
    • 3
    • 4

    其中,lib.path指定库文件生成的路径,lib.name指定库文件的名称,lib.files指定库文件的源文件,lib.commands指定库文件的生成命令。

    3. 如何生成可执行文件和文件拷贝

    可执行文件和文件拷贝的生成规则如下:

    executable.output = foo
    executable.files = source1.cpp source2.cpp
    executable.commands = $$QMAKE_CXX -o $$executable.target $$OBJECTS
    INSTALLS += exe
    exe.target = /usr/bin
    exe.files = $$executable.target
    exe.commands = $$QMAKE_COPY $$executable.target $$exe.target
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    其中,executable.output指定可执行文件的名称,executable.files指定可执行文件的源文件,executable.commands指定可执行文件的生成命令。INSTALLS指定生成文件的部署规则,exe.target指定部署目标目录,exe.files指定需要部署的文件,exe.commands指定文件拷贝的命令。

    四、Pri文件的使用案例

    以下是一个简单的Pri文件的示例:

    SRC_DIR = $$PWD/src
    OBJ_DIR = $$PWD/obj
    TARGET_DIR = $$PWD/bin
     
    INCLUDEPATH += $$PWD/include
    LIBS += -ldl
     
    target.path = $$TARGET_DIR
    target.name = myapp
     
    message(Building ... $$TARGET)
    message(Source files: $$SOURCES)
     
    contains(CONFIG, debug) {
        message(Building in debug mode...)
     
        TARGET = myappd
     
        COMMON_FLAGS = -g -O0
    }
     
    contains(CONFIG, release) {
        message(Building in release mode...)
     
        TARGET = myapp
     
        COMMON_FLAGS = -O2
    }
     
    sources = $$files($$SRC_DIR/*.cpp)
     
    target.sources = $$sources
     
    OBJECTS_DIR = $$OBJ_DIR/$$TARGET
     
    mocable_headers = $$_PRO_FILE_PWD_/input.h
    mocables = $$mocable_headers
    mocables.headers = $$mocable_headers
    mocables.commands = $$QTDIR/bin/moc $$mocables.headers -o $$mocables.target
     
    QMAKE_EXTRA_TARGETS += mocables
     
    unix {
        target.commands = $$QMAKE_CXX -o $$TARGET $$OBJECTS $$LIBS
        mocables.target = $${OBJECTS_DIR}/input.moc
        mkdir($${OBJECTS_DIR})
    } else {
        target.commands = link -out:$$TARGET.exe $$OBJECTS $$LIBS
        mocables.target = $${OBJECTS_DIR}/input.moc.obj
        mkdir($$system_path($${OBJECTS_DIR}))
    }
     
    target.dependency_type = TYPE_C
     
    target.CONFIG += dll
    target.LIBS += -lfoo
     
    DISTFILES += $$PWD/post_install_script
     
    mocables.CONFIG += no_link_target
     
    INSTALLS += target mocables
    target.files = $$TARGET
    mocables.files = $${mocable_headers}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    其中,该Pri文件实现了基本的编译和部署任务,具体实现方式如下:

    • 定义了SRC_DIR、OBJ_DIR、TARGET_DIR三个变量,用于指定源文件目录、目标文件目录和可执行文件目录。
    • 指定了头文件搜索路径和库文件搜索路径。
    • 定义了BUILD_MODE变量,用于指定构建模式,debug或release。
    • 根据BUILD_MODE的设置,确定了可执行文件的名称,以及编译选项。
    • 依据源文件目录下的所有.cpp文件,为目标文件指定源文件。
    • 指定了需要运行moc预编译器的头文件,用于生成mocable文件。
    • 指定了可执行文件的链接库、库文件等。
    • 配置了可执行文件的部署规则。

    通过这个简单的Pri文件,我们可以看到Qt Pri的强大和方便。在实际开发中,Pri文件可以根据需求定制,支持多库编译、多平台编译、资源文件编译等等,大大提高了开发效率。

  • 相关阅读:
    【Spring Boot】自定义启动器starter
    如何分析识别文章/内容中高频词和关键词?
    使用patch-package保存node_modules包修改
    Python21天学习挑战赛Day(3-4)·json标准库(应用)
    sizeof关键字
    计算机竞赛 深度学习疫情社交安全距离检测算法 - python opencv cnn
    如何把word的页眉页脚改为图片
    js中的this举例介绍
    基于java+SpringBoot+HTML+MySQL在线学习平台的设计与实现(程序+论文)
    什么样的应用程序适合使用Flutter开发桌面?
  • 原文地址:https://blog.csdn.net/m0_46577050/article/details/133884101