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