Хорошо. Я много искал, но пока не нашел хорошего решения. Я новичок в Qt
, У меня есть класс, который является QQuickItem
вот так,
class MyQuickItemClass : public QQuickItem
{
Q_OBJECT
SetInfo(SomeCppClass object)
};
Я делаю qmlRegisterType
в моем main.cpp
зарегистрировать его на qml
сторона, как это,
qmlRegisterType< MyQuickItemClass> («MyQuickItemClass», 1, 0, «MyQuickItemClass»);
Все хорошо, пока здесь. Но -> я хочу установить экземпляр объекта & некоторые свойства в MyQuickItemClass, которые также содержат некоторую логику C ++ & затем передать MyQuickItemClass
Возражать qml
, Или получить действительный экземпляр MyQuickItemClass
из Qml. Как я могу получить экземпляр vlid MyQuickItemClass
экземпляр объекта из QML
на стороне C ++ в main.cpp
?
Я попытался сделать следующее обучение по ссылке Вот. Но эта техника создает два отдельных объекта MyQuickItemClass
, Один из QML
, & один из c++
боковая сторона. Следовательно, не работает для меня.
Вот как я пытаюсь сделать это после долгих поисков.
int main(int argc, char *argv[])
{
qmlRegisterType< MyQuickItemClass >("MyQuickItemClass", 1, 0, "MyQuickItemClass");
QQmlApplicationEngine engine;
SomeCppClass someCppClassObject;
someCppClassObject.updateSomething();
MyQuickItemClass myquickItemObject;
myquickItemObject.SetInfo(someCppClassObject);
engine.rootContext()->setContextProperty("myquickItemObject", &myquickItemObject);
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();
}
Но, делая выше, получает конструктор MyQuickItemClass
звонил дважды. Однажды из cpp
сторона, когда я создал объект, и однажды из qml
боковая сторона. Подтвердите это, разместив точку останова в конструкторе MyQuickItemClass
также. В следствии, someCppClassObject
то, что я установил, равно нулю внутри MyQuickItemClass
когда программа запускается Потому что qml сделал последний вызов MyQuickItemClass
чтобы создать экземпляр, таким образом игнорируя MyQuickItemClass
объект, который я создал в main.cpp
,
Вот мой qml
код для MyQuickItemClass
:
import QtQuick 2.5
import MyQuickItemClass 1.0
ParentContainerItem {
id: parentItem
color: "black"
MyQuickItemClass {
id: myQuickItemID
visible: true
objectName: "myQuickItem"
property bool someProperty1: false
property bool someProperty2: true
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
}
//Other qml components
}
И это класс C ++, чей объект должен быть установлен в MyQuickItemClass
,
SomeCppClass {
//Pure C++ class. No Qt
}
Обратите внимание, что мне нужно сохранить MyQuickItemClass
происходит от QQuickItem
, Пожалуйста, предложите …
Обычно рекомендуется избегать доступа к объектам, созданным в QML. from outside
так как большинство методов доступа генерировали зависимость от C ++ к QML, ограничивая способ работы дерева QML.
Например. требуя, чтобы определенные объекты существовали в определенный момент времени, имея определенные objectName
ценности и т. д.
Лучше либо «зарегистрировать» объект со стороны QML, вызвав метод в открытом объекте / API C ++, либо сделать так, чтобы экземпляр объекта QML регистрировался из своего собственного кода C ++.
Последний, очевидно, по своей сути автоматический, то есть каждый экземпляр такого класса будет делать это, в то время как первый оставляет его на усмотрение кода QML, какой из созданных экземпляров он хочет сделать известным.
Делать следующее из предложения в обсуждении Вот решает проблему & получает действительный объект в файл QuickItem qml
QQuickItem *myItem = engine.rootObjects()[0]->findChild<QQuickItem *>("myQuickItem");