将C 对象暴露于QML并收听更改事件

expose a C++ object to QML and listen to change events

本文关键字:事件 QML 对象 暴露      更新时间:2023-10-16

我有一个我在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成员都在更改时都会被调用。

您可以使用Connections -Object为此。

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

另请参见家事更多示例,如何使用上下文属性。(它也有Connections的示例)