Могу ли я получить доступ к QPROPERTY, объявленному как CEMBER в C++?

У меня есть QQuickItem класс с некоторыми членами, используемыми в QML, поэтому они объявлены так:

Q_PROPERTY (bool myBool MEMBER _myBool NOTIFY myBoolChanged)

Если я хочу получить доступ к этому члену в коде C++ (из другого класса), у меня есть бесплатный get-accessor? Каков его синтаксис?

Документ для меня неясен:

Требуется ассоциация переменной MEMBER, если не указана функция доступа READ. Это делает данную переменную-член доступной для чтения и записи без необходимости создания функций доступа READ и WRITE.

Делает ли это член доступным для чтения и записи только в QML или также в C++?

2 ответа

Решение

Qt не генерирует для вас никакой C++ API getter, но значение свойства можно прочитать через систему мета-объектов, если вы хотите пойти по этому пути:

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

Если вы не работаете над чем-то общим, основанным на мета-объектной системе, вы можете определить нормальный метод получения для использования в C++. Ключевое слово MEMBER для Q_PROPERTY не является ярлыком для стандартных практик программирования.

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; 
...
Другие вопросы по тегам