Как получить действительный экземпляр QQuickItem на стороне C ++

Хорошо. Я много искал, но пока не нашел хорошего решения. Я новичок в 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, Пожалуйста, предложите …

2

Решение

Обычно рекомендуется избегать доступа к объектам, созданным в QML. from outside так как большинство методов доступа генерировали зависимость от C ++ к QML, ограничивая способ работы дерева QML.

Например. требуя, чтобы определенные объекты существовали в определенный момент времени, имея определенные objectName ценности и т. д.

Лучше либо «зарегистрировать» объект со стороны QML, вызвав метод в открытом объекте / API C ++, либо сделать так, чтобы экземпляр объекта QML регистрировался из своего собственного кода C ++.

Последний, очевидно, по своей сути автоматический, то есть каждый экземпляр такого класса будет делать это, в то время как первый оставляет его на усмотрение кода QML, какой из созданных экземпляров он хочет сделать известным.

1

Другие решения

Делать следующее из предложения в обсуждении Вот решает проблему & получает действительный объект в файл QuickItem qml

QQuickItem *myItem = engine.rootObjects()[0]->findChild<QQuickItem *>("myQuickItem");
0

По вопросам рекламы [email protected]