QuickBoot快速启动框架 - mrcao20/McQuickBoot GitHub Wiki
- 该框架为仓库中的McQuickBoot项目,主要目的是提供统一的QML到C++交互的方案,当然现在的功能越来越多,以后可能会更多。启动整个项目也很简单,下面给出main函数的代码:
更详细的代码可以参考博客或者Examples中的BootTest项目
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <McBoot/McQuickBoot.h> int main(int argc, char *argv[]) { return McQuickBoot::run(argc, argv, QLatin1String("qrc:/main.qml")); }
- 在使用此框架前,你需要优先从博客或者Examples中的IocTest项目中了解声明式注入的方法。了解之后将bean的MC_COMPONENT宏改为MC_CONTROLLER,该bean就会被框架识别并特殊处理,该bean中的被Q_INVOKABLE声明的函数可以在QML中使用$请求器请求到:
或者
$.get("beanName.funcName?param1=1¶m2=2").then(function(result) {});
上面的beanName就是MC_CONTROLLER宏包裹的字符串,funcName就是被Q_INVOKABLE声明的函数,param1、param2、param3为函数的参数名,其中param3将会被构造成一个QSharedPointer<QObject>或者QObject*,取决于具体类型,注意:这里不一定需要QObject,可以为任意能被QT元对象识别的具体对象,param4为该对象中的属性。then中传入一个回调函数,回调函数中的result参数即为funcName所指向函数的返回值,返回值建议只是用QString、QJsonObject、QObject*、QVariantList或QVariantMap。$.post("beanName.funcName", { param1: 1, param2: "2", param3: { param4: 1 } }).then(function(result) {});
- 内部提供一个beanName为app的controller,用于提供一些默认的功能,对应类:McApplicationController
- 提供invoke的同步请求接口syncInvoke,该函数的返回值即为controller的返回值,并且请求的线程为调用该函数的线程(通常为主线程)。
- 同样的,我在cpp中也提供了$宏,该宏的用法和QML中的$变量基本一致,但需要注意的是,该宏的invoke方法有四种重载,这里建议使用后面两个:
- 只有一个参数的函数和QML完全一样
- 第二个参数为QJsonObject的函数如何QML也基本一样
- 第二个参数为QVariant的函数最终会调用到第四个函数
- 第二个参数为QVariantList的函数,该list中的变量将会按照顺序传入Controller对应的函数中。 这里需要注意的是,如果Controller中的方法的参数需要接收QJsonObject的话,那么invoke函数传参时应该传QVariant(QJsonObject),如果直接传递QJsonObject类型将会进入到第二个函数。
- 如果你不想使用QML,仅仅只在cpp中使用$变量的话,那么可以不用McQuickBoot,只使用McQuickBootSimple即可:
QCoreApplication app(argc, argv); McQuickBootSimple::init(); return app.exec();
- 框架提供返回单个model的方法,但是返回的类型只能为QObject*或者QAbstractItemModel*,如果你需要一次性返回多个model,那么可以使用QT内建类型QVariantList或者QVariantMap来实现,即函数的返回值使用这两个中的任意一种。如果使用QVariantList,那么可以当做JS中的Array,如果使用QVariantMap,则可当做JS中的object
- 所有的model都需要将MC_COMPONENT改为MC_MODEL。
- 无论是$.get还是$.post亦或者是$.invoke的返回值都不允许赋值给其他变量,因为它们的返回值将在整个函数调用完毕时被析构。即then中的回调函数调用完毕后会被析构,但析构时间不确定。