Qt的多个子工程的创建
使用背景
工作中,Qt项目往往都是根据功能、逻辑等思想将一个大的项目划分多个子项目工程进行开发(如:qml子项目+控制逻辑子项目+数据子项目+日志子项目等等),因此不同子项目间需要互相调用,然而不同的子项目直接是无法相互调用的。
实际工程事例:
在这个实力中,mycluster文件夹为子项目的目录,mycluster.pro管理这些子项目
如何创建这么多子项目并管理?
- 1、首先创建一个子项目的总目录
创建项目—>其他项目—>子项目目录 - 2、创建qml子项目,这个子项目一般是一个正常的Qt Quick Applicatiuon项目,它包括main.cpp、main.qml等
创建项目—>Application—>Qt Quick Applicatiuon - 3、创建其他的子项目(如:控制逻辑子项目+数据子项目等等)
- 因为我们可能要跨子项目互相调用,因此我们可以把这些模块通过C++库形式来创建;
- 创建项目—>库—> C++ Library —>Qt moudule选core即可。并且该自动生成的子项目里会包含一个 子项目名称_global.h的文件,后面会讲。
关联各个子项目
通过上面1~3步骤,我们只是创建了这些子项目工程,但是它们之间并不能相互的关系。因此,我们需要在每个子项目的pro文件进行配置,将他们关联起来。
创建好的总工程如图所示:
-
1、总目录的mycluster.pro文件设置,将这些子项目都添加到mycluster项目里来管理:
-
2、LogicControl子项目,这里我们这个子项目要提供给其它的子项目调用;因此,通过LogicControl.pro设置该子项目为外部库的形式,并且要LogicControl_global.h文件也要进行配置:
同理:DataSource子项目也是如此操作。 -
3、在qmlProject的子项目中我们需要手动添加LogicControl和DataSource这两个子项目库
然后,qmlProject.pro文件会自动生成以下代码
如何在QML工程中去使用C++类?
有几下几种常见方式:
- 方式一:使用rootContext上下文方式管理
- 方式二:使用qmlRegisterSingletonType方法进行注册
- 通常都是使用方式二将C++类对象注册到QML工程中。但是要注意:
这qmlRegisterSingletonType方法的第五个参数是一个回调函数,该回调函数的参数必须是(QQmlEngine*, QJSEngine* )
,仅管这两个参数用不到,即:SystemSetting *SystemSetting::instance = nullptr; //静态成员属性 SystemSetting *SystemSetting::getInstance(){ if(nullptr == instance){ instance = new SystemSetting;} return instance; } QObject* SystemSetting::singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine){ Q_UNUSED(engine) Q_UNUSED(scriptEngine) return SystemSetting::getInstance(); }