1
我有一個我用C++定義的對象,並試圖向QML公開一個成員字符串。該類被定義爲:公開一個C++對象到QML並聽取更改事件
#ifndef MYTYPE_H
#define MYTYPE_H
#include <QString>
#include <QObject>
class MyType : public QObject
{
Q_OBJECT
Q_PROPERTY(QString foo READ foo WRITE setFoo NOTIFY fooChanged)
public:
MyType(QObject *parent = nullptr) :
QObject(parent),
mFoo("0")
{
}
QString foo() const
{
return mFoo;
}
void setFoo(QString foo)
{
if (foo == mFoo)
return;
mFoo = foo;
emit fooChanged(mFoo);
}
signals:
void fooChanged(QString foo);
private:
QString mFoo;
};
#endif // MYTYPE_H
所以我試圖揭露mFoo
對象QML。
QtQuickControlsApplication app(argc, argv);
QQmlApplicationEngine engine(QUrl("qrc:/main.qml"));
qmlRegisterType<MyType>("MyType", 1, 0, "MyType");
MyType myType;
QObject *topLevel = engine.rootObjects().value(0);
engine.rootContext()->setContextProperty("foo", &myType);
現在在我的QML,我怎麼能聽,我露出了字符串的變化:現在,我與應用程序上下文設置它。所以我想要一個監聽器方法,每當mFoo
成員改變時都會被調用。
嘗試使用'target'創建['Connections'](http://doc.qt.io/qt-5/qml-qtqml-connections.html) - 對象成爲你的上下文屬性並處理'onFooChanged'。我還沒有完成上下文屬性,現在我無法測試它。 – derM
@derM謝謝!不知道這個'Connections'對象。有用!如果你想寫它作爲答案,請繼續。 – Luca
@Luca沒有答案,但相關。當您僅將類用作上下文屬性時,不必調用「qmlRegisterType」。 – Macias