首页 > 解决方案 > 在可从 QML 访问的 C++ QObject 子类中创建成员变量?

问题描述

假设我在 C++ 中定义了一个QObject子类:Foo

class Foo : public QObject {
    Q_OBJECT
public:
    /* ... */
};

并说我将它附加到 a 的根上下文中,QQmlApplicationEngine如下所示:

Foo foo;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("foo", (QObject*)&foo);

所以现在我可以通过调用从 QML调用一个Q_INVOKABLE成员函数(或似乎是插槽)Foo,比如调用:doStuff()foo.doStuff()

Item {
   onWhatever: { foo.doStuff(); }
}

是否可以在 C++ 中定义一个成员变量Foo,使其在 QML 中可见,并且当该成员变量更改时,它在 QML 中的任何用法也会更新?

如:

class Foo : public QObject {
    Q_OBJECT
public:

    Q_??? int bar = 40;
};

在 QML 中:

Item {
    width: foo.bar + 100
}

所以最初这个项目的宽度是140,然后在 C++ 中:

foo.bar = 80

现在项目的宽度自动更改为180

有什么可以做我上面想做的事情吗?( Q_???)

标签: c++qtqml

解决方案


您必须创建一个 Q_PROPERTY:

#ifndef FOO_H
#define FOO_H

#include <QObject>

class Foo : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int bar READ bar NOTIFY barChanged)
public:
    explicit Foo(QObject *parent = nullptr);
    int bar() const;
    void setBar(int bar);
    Q_INVOKABLE void doStuff();
Q_SIGNALS:
    void barChanged(int bar);
private:
    int m_bar;
};

#endif // FOO_H
#include "foo.h"

Foo::Foo(QObject *parent) : QObject(parent), m_bar(40){}

int Foo::bar() const{
    return m_bar;
}

void Foo::setBar(int bar){
    if (m_bar == bar)
        return;
    m_bar = bar;
    emit barChanged(m_bar);
}

void Foo::doStuff()
{
    setBar(80);
}

如上所述,“bar”属性是 QML 中的只读属性,如果您希望它是可写的,那么您还必须公开 setter:

Q_PROPERTY(int bar READ bar WRITE setBar NOTIFY barChanged)

推荐阅读