c++ - 在可从 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_???
)
解决方案
您必须创建一个 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)
推荐阅读
- javascript - @babel/plugin-proposal-class-properties 不起作用
- angular - 不同离子平台的不同角度路由
- oracle - Oracle 多左外连接仅 max() 行
- javascript - nock 没有正确创建我的虚假请求
- c# - 如何更新实体框架中的元素列表?
- python - 如何以毫秒为单位计算 python 的“time.process_time()”的返回值
- python-3.x - 如何在 Python3.7 tkinter 中制作文本链接
- java - 添加 BouncyCastle Provider 会破坏 KeyStore.load()
- php - 通过php条件显示给定日期的所有数据
- python - 当scrapy完成时,我想从所有抓取的数据中创建一个数据框