2017-09-01 35 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的示例)