2017-09-01 7 views
1

私はC++で定義したオブジェクトを持っていますが、メンバーストリングをQMLに公開しようとしています。だから私はQMLにmFooオブジェクトを公開しようとしていますQMLにC++オブジェクトを公開し、変更イベントをリッスンします

#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 

:クラスは次のように定義されます。今、私は、アプリケーションのコンテキストでそれを設定しています:私の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); 

、どのように私は、露光していた文字列の変更を聞くことができます。だから、mFooのメンバーが変更されるたびに呼び出されるリスナーメソッドが必要です。

+1

「接続」(http://doc.qt.io/qt-5/qml-qtqml-connections.html)オブジェクトを作成してください。あなたのコンテクストプロパティと 'onFooChanged'を処理します。私はまだコンテキストのプロパティでそれをしていない、と私は今すぐそれをテストすることはできません。 – derM

+0

@derMありがとう!この 'Connections'オブジェクトについて知りませんでした。できます!答えとして書く場合は、先に進んでください。 – Luca

+0

@ルーカ答えはありませんが、関連しています。クラスをコンテキストプロパティとしてのみ使用する場合は、 'qmlRegisterType'を呼び出す必要はありません。 – Macias

答えて

1

これにはConnectionsオブジェクトを使用できます。

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

また、hereを参照してください。いくつかの例、コンテキストプロパティの使用方法。 (Connectionsの例もあります)

関連する問題