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
のメンバーが変更されるたびに呼び出されるリスナーメソッドが必要です。
「接続」(http://doc.qt.io/qt-5/qml-qtqml-connections.html)オブジェクトを作成してください。あなたのコンテクストプロパティと 'onFooChanged'を処理します。私はまだコンテキストのプロパティでそれをしていない、と私は今すぐそれをテストすることはできません。 – derM
@derMありがとう!この 'Connections'オブジェクトについて知りませんでした。できます!答えとして書く場合は、先に進んでください。 – Luca
@ルーカ答えはありませんが、関連しています。クラスをコンテキストプロパティとしてのみ使用する場合は、 'qmlRegisterType'を呼び出す必要はありません。 – Macias