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

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

#include

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("FactoryDemo", 1, 0, "Productor");

qmlRegisterSingletonType("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);

查看原文