Могу ли я получить доступ к 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;
...