Я новичок в QML и имеет проблемы при доступе к property.property в Си ++ объект:QML свойства свойства C++ объект
C++, частота и станция оба являются Qt метатипа зарегистрированы объекты:
CStation *station = new CStation(...); // QObject
CFrequency *frequency = new CFrequency(..); // QObject
QQmlContext *qmlContext = viewer.rootContext();
qmlContext->setContextProperty("myatcstation", station);
qmlContext->setContextProperty("myfrequency", frequency);
QML:
RowLayout { ....
TextField {
text: myatcstation.toQString(true)
}
}
.... text: myfrequency.toQString(true)
Это работает, но когда я пишу: text: myatcstation.frequency.toQString(true)
я получить TypeError: Object [object Object] has no method 'toQString'
frequency
является свойством класса CStation
множества, как Q_PROPERTY(CFrequency frequency READ getFrequency)
перепроверить в C++ работает:
CFrequency test = station->property("frequency").value<CFrequency>();
- Edit: ответ Франка -
Оба класса являются производными от QObject
, и это не в соответствии с учебником, поскольку они сделаны скопированными. Я знаю ситуацию Identity vs value.
В основном частота - объект значения, но я сделал его QObject
, поэтому я могу использовать с ним свойства (см. Any chance to use non QObject classes with QML). В этом примере toString
- Q_INVOKABLE
, частота в нерабочем случае возвращает копию QObject
, полученного CFrequency
.
- Edit: Дополнительные данные -
Когда я изменить свойство частоты, чтобы вернуть CFrequency*
вместо CFrequency
он не работает. Когда я получаю TypeError: Cannot call method 'toQString' of undefined
, ситуация кажется такой же. CFrequency
работает только один, но QML не понимает, что myatcstation.frequency
является частотным объектом, который имеет toString
.
Хороший совет, добавленная информация выше. Вопрос в том, должен ли он работать, если CFrequency (который является возвратом QObject по значению) возвращается как копия (даже если не требуется копировать QObjects). –