2017-09-01 75 views
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成員改變時都會被調用。

+1

嘗試使用'target'創建['Connections'](http://doc.qt.io/qt-5/qml-qtqml-connections.html) - 對象成爲你的上下文屬性並處理'onFooChanged'。我還沒有完成上下文屬性,現在我無法測試它。 – derM

+0

@derM謝謝!不知道這個'Connections'對象。有用!如果你想寫它作爲答案,請繼續。 – Luca

+0

@Luca沒有答案,但相關。當您僅將類用作上下文屬性時,不必調用「qmlRegisterType」。 – Macias

回答

1

您可以使用Connections對象。

Connections { 
    target: yourContextProperty 
    onFooChanged: console.log('I do something cool when foo changes!') 
} 

又見here一些例子,如何使用上下文屬性。 (它也有一個Connections的示例)