我可以在C ++中访问声明为MEMBER的QPROPERTY吗?

时间:2018-02-26 10:33:04

标签: c++ qt qproperty

我有一个QQuickItem类,其中一些成员在QML中使用,所以它们被声明为:

Q_PROPERTY (bool myBool MEMBER _myBool NOTIFY myBoolChanged)

如果我想在C ++代码中访问此成员(来自其他类),我是否有 free get-accessor?它的语法是什么?

我不清楚这份文件:

  

如果没有READ访问器功能,则需要MEMBER变量关联   已指定。这使得给定成员变量可读并且   可写,无需创建READ和WRITE访问器   功能

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

2 个答案:

答案 0 :(得分:2)

Qt 创建" C ++"吸气剂或二传手。 使用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; 
...

答案 1 :(得分:2)

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

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

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