特别鸣谢:
- Qt 之 pro 配置多个子工程/子模块
- Qt Creator创建子目录项目并自定义目标文件输出目录
使用子目录项目来 配置多个子工程/子模块
简述
我们在构建QT项目的时候,有时候希望每个界面分开编写,或者逻辑功能和界面分开编写,来解耦合,让我们的项目更多模块能够同时并行,而不是只有项目来完成所有的功能。咱们平时在写小项目的时候,直接使用一个QWidget Application就可以用来实现全部功能。
那么我们现在需要把某些功能编译成一个库,然后在主程序中对相关的库进行调用,我们需要用什么方式来实现呢?
就一起来思考一下这个问题吧,这篇文章也是记录我学习如何构建Qt多模块项目的一个过程。
项目配置概览
这次的实验项目的结构如下:
项目的多工程配置
如果需要管理多工程(pro),比如:库工程、界面工程,其中,每一个工程均可单独编译成功,但存在依赖关系。也就是说,lib2依赖于lib1,而UI依赖于lib2。
配置如下:
- 配置TEMPLATE为subdirs设置多工程
- 配置SUBDIRS,指定需要添加的工程模块
- 配置CONFIG为ordered指定顺序编译
举例来说,本次编写的测试工程的.pro就需要如下方式来编写:
TEMPLATE = subdirs
CONFIG += ordered # 按照SUBDIRS顺序来编译程序,保证先后的依赖关系
SUBDIRS += \ # 这里的先后顺序决定了编译顺序,每次编写的时候,需要先考虑清楚
SynToSystem \
TestTask
这样这个工程就可以在主程序里调用SynToSystem这个库里面的内容了。
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "../SynToSystem/syntosystem.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SynToSystem syn;
MainWindow w;
w.set_tips_label_text(syn.m_str);
w.show();
return a.exec();
}
syntosystem.h
#ifndef SYNTOSYSTEM_H
#define SYNTOSYSTEM_H
#include "syntosystem_global.h"
#include <QString>
class SYNTOSYSTEMSHARED_EXPORT SynToSystem
{
public:
SynToSystem();
QString m_str;
};
#endif // SYNTOSYSTEM_H
syntosystem.cpp
#include "syntosystem.h"
#include <QDebug>
SynToSystem::SynToSystem()
{
qDebug() << "Welcom to Syn to system.";
m_str = "SynToSystem init.";
qDebug() << m_str;
}
使用多模块
延续多工程,如果某一个工程功能比较多,我们必然要进行模块化。例如:界面工程包含:登录界面、设置界面、主界面。。。这时,我们就可以使用pri模块化了。 这里进行一个举例,项目代码中暂时没有演示这个方面:
include($$PWD/Login/Login.pri)
include($$PWD/Settings/Settings.pri)
include($$PWD/MainWindow/MainWindow.pri)