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

这里写图片描写叙述

转载于:https://www.cnblogs.com/mfmdaoyou/p/7355111.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值