1 新建项目
qt在新建项目时选择“其他项目-子目录项目”创建拥有子项目模式的QT项目
2添加子项目
有两种选择,一个app主项目+多个lib子项目,或者全是app(可执行文件模式)子项目
添加app子项目方法:
添加lib子项目方法:
2.1 一个主app项目+多个子lib项目
假设新建项目TEST
,主app项目MainPro
,子lib项目subPro1
,subPro2
,整体项目文件格式为
利用SUBDIRS
实现多项目管理,TEST.pro
文件中为
TEMPLATE = subdirs
SUBDIRS +=\
subPro1 \
subPro2 \
MainPro
#CONFIG选项要求各子项目按顺序编译,子目录的编译顺序在SUBDIRS 中指明,写这句话的目的是将所有的子项目构建
CONFIG += ordered
只有主app项目MainPro
中有一个main.cpp
,在MainPro.pro
文件中有
TEMPLATE = app
表示该项目为一个app项目,构建生成可执行文件(.exe)
在lib子项目中,subPro1.pro
中有
TEMPLATE = lib
表示该项目为一个lib项目,构建生成库文件(.dll和.a)。
可以在主项目中编写代码来调用子项目,具体方法参照
https://blog.csdn.net/chen1231985111/article/details/126251292
2.2 一个主app项目+多个子app项目
这里的每一个app项目都有自己的main.cpp,具体格式类似为下图,在这种有多个应用程序的项目中(有多个main.cpp,构建后有多个.exe),默认执行先添加的子项目(只能执行一个.exe)
利用SUBDIRS
实现多项目管理,TEST2.pro
文件中为
TEMPLATE = subdirs
SUBDIRS +=\
mainApp \
subApp1 \
mainApp.pro
和subApp1.pro
中均有
TEMPLATE = app
表示两个均为可执行文件,可以单独运行mainApp
和subApp1
,
因为有两个app,运行时默认执行先添加的主项目mainApp,
2.2.1 利用QProcess在主项目mainApp中调用子项目subApp1(AI回答)
可以在主项目中利用QProcess来调用子项目(这里假设子项目是可执行的应用程序),您需要确保子项目已经被构建成可执行文件,并且您知道这些可执行文件的路径。然后,您可以在主项目的代码中创建QProcess对象,并使用这些对象的start()方法来启动子项目的可执行文件。
以下是一个基本的示例,展示了如何在Qt的主项目中使用QProcess来启动两个子项目(app1和app2)的可执行文件:
确保子项目已构建:首先,确保您的子项目(app1和app2)已经被成功构建,并且生成了可执行文件。这些可执行文件通常位于Qt Creator的构建目录中,路径可能类似于build-app1-Desktop_Qt_XX_YY_ZZ_64bit-Debug/app1.exe
(对于Windows)或相应的路径(对于macOS或Linux)。
修改主项目的代码:在主项目的某个合适的位置(例如,一个按钮的槽函数中),创建QProcess对象并启动子项目的可执行文件。
// 假设这是MainWindow类中的一个槽函数,用于启动子项目
void MainWindow::startSubprojects()
{
// 假设可执行文件位于与主项目构建输出相同的目录结构中
// 注意:这里的路径是示例性的,您需要根据实际情况进行调整
QString executablePathApp1 = QCoreApplication::applicationDirPath() + "/../subprojects/build-app1-Desktop_Qt_XX_YY_ZZ_64bit-Debug/app1.exe";
QString executablePathApp2 = QCoreApplication::applicationDirPath() + "/../subprojects/build-app2-Desktop_Qt_XX_YY_ZZ_64bit-Debug/app2.exe";
// 创建QProcess对象
QProcess *process1 = new QProcess(this); // 假设this是指向MainWindow的指针
QProcess *process2 = new QProcess(this);
// 启动子项目
process1->start(executablePathApp1);
process2->start(executablePathApp2);
// 可以连接QProcess的信号来接收子进程的输出或状态变化
connect(process1, &QProcess::readyReadStandardOutput, this, &MainWindow::onReadyReadStandardOutput);
connect(process2, &QProcess::finished, this, &MainWindow::onProcessFinished);
// ... 其他需要的连接和逻辑
}
// 槽函数来处理子进程的输出(示例)
void MainWindow::onReadyReadStandardOutput()
{
QProcess *process = qobject_cast<QProcess *>(sender());
if (process) {
QByteArray output = process->readAllStandardOutput();
// 处理输出...
}
}
// 槽函数来处理子进程完成的事件(示例)
void MainWindow::onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
QProcess *process = qobject_cast<QProcess *>(sender());
if (process) {
qDebug() << "Process" << process->program() << "finished with exit code" << exitCode << "and status" << exitStatus;
// 清理资源或执行其他逻辑...
}
}
注意:
上面的路径QCoreApplication::applicationDirPath() + "/../subprojects/..."
是示例性的,并且可能需要根据您的实际项目结构和构建设置进行调整。
QProcess对象通常不会立即启动子进程,而是异步地执行。因此,您可能需要连接QProcess的信号(如started()、finished()、readyReadStandardOutput()等)来监控子进程的状态和输出。
在实际应用中,您可能还需要处理错误情况,例如子进程无法启动或崩溃。这可以通过连接QProcess的errorOccurred()信号来实现。
如果您想要在主项目中与这些子进程进行更复杂的交互(例如,发送命令或数据),您可能需要考虑使用进程间通信(IPC)机制,如命名管道、套接字、共享内存等。但是,请注意,这通常比简单地启动和监控子进程要复杂得多。
3 路径问题
对于总项目中多个子目录项目构建生成的.exe或.dll或.a文件,可以通过在所有子目录项目的.pro中添加语句将构建生成的文件放到同一个文件夹下。
以TEST项目为例,项目文件结构为
在MainPro.pro、subPro1.pro、subPro2.pro文件中都添加
DESTDIR = ../TEST_bulid
这里的含义是将工程构建生成的可执行文件或库文件都放到自己新建的TEST_bulid文件夹中方便管理,TEST_bulid文件夹在TEST项目build文件夹的下一级中,即与子项目文件夹同级。
.pro工程的配置
选项 | 说明 |
---|---|
TEMPLATE | 模板变量告诉qmake为这个应用程序生成哪种makefile |
CONFIG | 指定编译器选项和项目配置,值由qmake内部识别并具有特殊意义。 |
DEFINES | qmake添加这个变量的值作为编译器C预处理器宏(-D选项)。 |
INCLUDEPATH | 指定编译项目时应该被搜索的#include目录。 |
DEPENDPATH | 指定程序编译时依赖的相关路径。 |
DESTDIR | 指定在何处放置目标文件。 |
TARGET | 指定目标文件的名称。默认情况下包含的项目文件的基本名称。 |
OUT_PWD | 指定构建目录。 |
MOC_DIR | 指定来自moc的所有中间文件放置的目录(含Q_OBJECT宏的头文件转换成标准.h文件的存放目录)。 |
OBJECTS_DIR | 指定所有中间文件.o(.obj)放置的目录。 |
RCC_DIR | 指定Qt资源编译器输出文件的目录(.qrc文件转换成qrc_*.h文件的存放目录)。 |
LIBS | 指定链接到项目中的库列表。-L后是库文件的目录,-l后是具体的库的名字(后缀不用加)。例如:LIBS += -L$$PWD/../../../ThirdLib/winapi -lWSock32 |
RC_ICONS | 仅适用于Windows,指定的图标应该包含在一个生成的.rc文件里。如果RC_FILE 和RES_FILE变量都没有设置这才可利用。 |
TRANSLATIONS | 指定包含用户界面翻译文本的翻译(.ts)文件列表。 |
TEMPLATE配置项
选项 | 说明 |
---|---|
app | 创建一个用于构建应用程序的Makefile(默认)。 |
lib | 创建一个用于构建库的Makefile。 |
subdirs | 创建一个用于构建目标子目录的Makefile,子目录使用SUBDIRS变量指定。 |
aux | 创建一个不建任何东西的Makefile。如果没有编译器需要被调用来创建目标,比如你的项目使用解释型语言写的,使用此功能。注:此模板类型只能用于Makefile-based生成器。特别是,它不会工作在vcxproj和Xcode生成器。 |
vcapp | 仅适用于Windows。创建一个Visual Studio应用程序项目。 |
vclib | 仅适用于Windows。创建一个Visual Studio库项目。 |
CONFIG 配置项
选项 | 说明 |
---|---|
release | 项目以release模式构建。如果也指定了debug,那么最后一个生效。 |
debug | 项目以debug模式构建。 |
debug_and_release | 项目准备以debug和release两种模式构建。 |
debug_and_release_target | 此选项默认设置。如果也指定了debug_and_release,最终的debug和release构建在不同的目录。 |
build_all | 如果指定了debug_and_release,默认情况下,该项目会构建为debug和release模式。 |
autogen_precompile_source | 自动生成一个.cpp文件,包含在.pro中指定的预编译头文件。 |
ordered | 使用subdirs模板时,此选项指定应该按照目录列表的顺序处理它们。 |
precompile_header | 可以在项目中使用预编译头文件的支持。 |
warn_on | 编译器应该输出尽可能多的警告。如果也指定了warn_off,最后一个生效。 |
warn_off | 编译器应该输出尽可能少的警告。 |
exceptions | 启用异常支持。默认设置。 |
exceptions_off | 禁用异常支持。 |
rtti | 启用RTTI支持。默认情况下,使用编译器默认。 |
rtti_off | 禁用RTTI支持。默认情况下,使用编译器默认。 |
stl | 启用STL支持。默认情况下,使用编译器默认。 |
stl_off | 禁用STL支持。默认情况下,使用编译器默认。 |
thread | 启用线程支持。当CONFIG包括qt时启用,这是缺省设置。 |
c++11 | 启用c++11支持。如果编译器不支持c++11这个选项,没有影响。默认情况下,支持是禁用的。 |
c++14 | 启用c++14支持。如果编译器不支持c++14这个选项,没有影响。默认情况下,支持是禁用的。 |
原文链接:https://blog.csdn.net/qq_44721831/article/details/128374163
具体参照链接:
http://www.360doc.com/content/24/0514/09/65283686_1123250789.shtml
https://blog.csdn.net/qq_44721831/article/details/128374163?spm=1001.2014.3001.5506