QuickBoot快速启动框架 - mrcao20/McQuickBoot GitHub Wiki

大致介绍

  1. 该框架为仓库中的McQuickBoot项目,主要目的是提供统一的QML到C++交互的方案,当然现在的功能越来越多,以后可能会更多。启动整个项目也很简单,下面给出main函数的代码:
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    #include <McBoot/McQuickBoot.h>
    
    int main(int argc, char *argv[])
    {
        return McQuickBoot::run(argc, argv, QLatin1String("qrc:/main.qml"));
    }
    
    更详细的代码可以参考博客或者Examples中的BootTest项目
  2. 在使用此框架前,你需要优先从博客或者Examples中的IocTest项目中了解声明式注入的方法。了解之后将bean的MC_COMPONENT宏改为MC_CONTROLLER,该bean就会被框架识别并特殊处理,该bean中的被Q_INVOKABLE声明的函数可以在QML中使用$请求器请求到:
    $.get("beanName.funcName?param1=1&param2=2").then(function(result) {});
    
    或者
    $.post("beanName.funcName", {
        param1: 1,
        param2: "2",
        param3: {
            param4: 1
        }
    }).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。
  3. 内部提供一个beanName为app的controller,用于提供一些默认的功能,对应类:McApplicationController
  4. 提供invoke的同步请求接口syncInvoke,该函数的返回值即为controller的返回值,并且请求的线程为调用该函数的线程(通常为主线程)。
  5. 同样的,我在cpp中也提供了$宏,该宏的用法和QML中的$变量基本一致,但需要注意的是,该宏的invoke方法有四种重载,这里建议使用后面两个:
    • 只有一个参数的函数和QML完全一样
    • 第二个参数为QJsonObject的函数如何QML也基本一样
    • 第二个参数为QVariant的函数最终会调用到第四个函数
    • 第二个参数为QVariantList的函数,该list中的变量将会按照顺序传入Controller对应的函数中。 这里需要注意的是,如果Controller中的方法的参数需要接收QJsonObject的话,那么invoke函数传参时应该传QVariant(QJsonObject),如果直接传递QJsonObject类型将会进入到第二个函数。
  6. 如果你不想使用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中的回调函数调用完毕后会被析构,但析构时间不确定。

其他功能

⚠️ **GitHub.com Fallback** ⚠️