将C ++对象公开给QML并监听更改事件

时间:2017-09-01 12:39:55

标签: c++ qt qml qt5 qqmlcontext

我有一个我在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 个答案:

答案 0 :(得分:1)

您可以使用Connections - 对象。

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

另请参阅here更多示例,如何使用上下文属性。 (它还有一个Connections

的例子