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);

    这里写图片描写叙述

  • 相关阅读:
    一次线上遇到磁盘IO瓶颈的问题处理
    修改mysql错误日志级别
    binlog_format日志错误
    mysql重启遇到的问题
    Mysql两张表的关联字段不一致
    多线程中的join总结笔记
    java后端实习生面试题目
    javascript 中的 innerHTML 是什么意思
    为什么java实体类需要重写toString方法
    关于maven中的快照版本(snapshot)与正式版本(release)解析。
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7355111.html
Copyright © 2011-2022 走看看