zoukankan      html  css  js  c++  java
  • QML 与 C++ 交互之工厂方法

    QML 与 C++ 交互之工厂方法

    先看例如以下的类声明,声明了一个产品类和工厂类。

    #include <QObject>
    
    class Productor : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)
    public:
        explicit Productor(QObject *parent = 0);
    
        int age() const;
        void setAge(int age);
    signals:
        void ageChanged();
    
    private:
        int m_age;
    };
    
    
    class QQmlEngine;
    class QJSEngine;
    class Factory : public QObject
    {
        Q_OBJECT
    public:
        Factory(QObject* parent);
    
        Q_INVOKABLE Productor* create();
    
        static QObject *singleton(QQmlEngine *engine, QJSEngine *scriptEngine);
    };

    c++ main 函数中注冊方式例如以下:

        qmlRegisterType<Productor>("FactoryDemo", 1, 0, "Productor");
    
        qmlRegisterSingletonType<Factory>("FactoryDemo", 1, 0, "Factory", &Factory::singleton);

    Productor 注冊为类型,Factory 注冊为单例。在 QML 中使用例如以下:

    import QtQuick.Controls 1.2
    import FactoryDemo 1.0
    
    Button {
        text: qsTr("user create function")
        onClicked: {
            var p = Factory.create();
            console.log(p.age);
        }
    }

    语法补全和智能提示

    因为 QtCreator 对 QML 函数的返回值类型支持不佳,所以无法对 p 进行代码的智能提示。

    这个时候就能够使用属性与 QOjbect* 来 hack 一下了。

    仅仅需改动一行代码。且看例如以下:

    class Factory : public QObject
    {
        Q_OBJECT
        Q_PROPERTY(Productor* newCreate READ create )
        ...
    };

    仅仅需加入一行属性声明的代码就可以。

    qml 使用例如以下。能够进行代码补全。

                var p2 = Factory.newCreate;
                console.log(p2.age);

    这里写图片描写叙述

  • 相关阅读:
    生成数据库结构设计说明书的存储过程
    C#检测上传图片是否安全函数
    设定下拉列表控件DropDownList,复选按钮CheckBox,RadioButton默认值总结测试
    C#批量重命名工具V2.0
    个人一些工作经验方式积累办法
    修身《孟子》尽心篇
    linux 命令 lspci lsusb
    重拾信心
    linux eclipse
    A lunch in Gordon Market with WWF
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7355111.html
Copyright © 2011-2022 走看看