1

我有一个QQuickItem类,其中包含 QML 中使用的一些成员,因此它们的声明如下:

Q_PROPERTY (bool myBool MEMBER _myBool NOTIFY myBoolChanged)

如果我想用 C++ 代码(从另一个类)访问这个成员,我有免费的get-accessor 吗?它的语法是什么?

我不清楚该文档:

如果未指定 READ 访问器函数,则需要 MEMBER 变量关联。这使得给定的成员变量可读可写,而无需创建 READ 和 WRITE 访问器函数。

这是否使成员仅在 QML 或 C++ 中可读可写?

4

2 回答 2

3

Qt 不会为您生成任何 C++ API getter,但如果您想这样做,可以通过元对象系统读取属性值:

QMetaProperty prop = obj->metaObject()->property(...);
bool value = prop.read(obj).toBool();

除非您正在处理基于元对象系统的通用程序,否则您可能希望定义一个普通的 getter 以在 C++ 中使用。Q_PROPERTY 的 MEMBER 关键字并不是标准编程实践的捷径。

于 2018-02-26T10:54:23.940 回答
2

Qt不会创建“C++”getter 或 setter。使用 MEMBER,Qt MetaSystem 只能直接访问成员变量。

使用 MEMBER 关键字,将在 moc 文件中创建类似的内容:

Q_PROPERTY(int prop MEMBER m_prop NOTIFY propChanged) 
....
else if (_c == QMetaObject::ReadProperty) { 
void *_v = _a[0]; 
switch (_id) { 
case 0: *reinterpret_cast< int*>(_v) = m_prop; break; 
....

并且使用 READ 关键字将在 moc 文件中创建类似的内容:

Q_PROPERTY(int prop READ getProp NOTIFY propChanged) 
...
else if (_c == QMetaObject::ReadProperty) { 
void *_v = _a[0]; 
switch (_id) { 
case 0: *reinterpret_cast< int*>(_v) = getProp(); break; 
...
于 2018-02-26T10:54:09.013 回答