標籤:content use main cli number views .net article 屬性
QML 與 C++ 互動之Factory 方法
先看例如以下的類聲明,聲明了一個產品類和工廠類。
#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_OBJECTpublic: 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.2import FactoryDemo 1.0Button { 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);
QML 與 C++ 互動之Factory 方法