Как добавить динамически созданный QQuickitem в main.qml моего приложения или список элементов QML
Мне нужно динамически создать QQuickitem
и добавить в мой main.qml
,
Пытаясь это сделать, я создаю QQuickitem
следующим образом.
qml_engine->load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
// Creating my QQuickItem here
QQuickItem * dynamic_quick_item = new QQuickItem();
dynamic_quick_item->setObjectName("DynamicQuickItemObject");
dynamic_quick_item->setHeight(500);
dynamic_quick_item->setWidth(500);
dynamic_quick_item->setParent(qml_engine->parent());
У меня есть доступ к QQmlApplicationEngine
в main.cpp
,
Вопрос: Как я могу добавить dynamic_quick_item
к предметам в моем main.qml
? Хочу динамически добавить dynamic_quick_item
к списку предметов в моем main.qml
со стороны C++.
Не нужно быть добавленным к main.qml
, Только хочу добавить QQuickItem
к списку элементов QML, определенных в моем main.qml
который может быть очень похож на другие элементы QML, определенные в main.qml
, Есть ли возможный способ добиться этого?
Обновление: Выполнение следующих действий должно получить действительный экземпляр QQuickItem
Я добавил. Но это не так
QQuickItem *my_dynamic_quickitem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("DynamicQuickItemObject");
я получил my_dynamic_quickitem
как ноль, что означает, что созданный мной QQuickItem так и не был добавлен
1 ответ
Элемент QML может быть динамически загружен с помощью QQmlComponent. QQmlComponent загружает документ QML как объект C++, который затем может быть изменен из кода C++.
Подробное описание вы можете найти в этом руководстве http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html
Это пример динамического создания объекта QML и помещения его в файл QML.
#include <QGuiApplication>
#include <QQmlComponent>
#include <QQmlEngine>
#include <QQuickItem>
#include <QQuickView>
int main(int argc, char** argv)
{
QGuiApplication app(argc, argv);
// Init the view and load the QML file.
QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///closeups/closeups.qml"));
// The size of the window
view.setMinimumSize(QSize(800, 600));
// Create Text QML item.
QQmlEngine* engine = view.engine();
QQmlComponent component(engine);
component.setData("import QtQuick 2.0\nText {}", QUrl());
QQuickItem* childItem = qobject_cast<QQuickItem*>(component.create());
if (childItem == nullptr)
{
qCritical() << component.errorString();
return 0;
}
// Set the text of the QML item. It's possible to set all the properties
// with this way.
childItem->setProperty("text", "Hello dynamic object");
// Put it into the root QML item
childItem->setParentItem(view.rootObject());
// Display the window
view.show();
return app.exec();
}