Как добавить динамически созданный 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 со стороны С++.

Его не нужно добавлять к 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 никогда не добавлялся


person TheWaterProgrammer    schedule 23.08.2017    source источник


Ответы (1)


Элемент QML может быть динамически загружен с помощью QQmlComponent. QQmlComponent загружает документ QML как объект C++, который затем можно изменить из кода C++.

Вы можете найти подробное описание в этом руководстве http://doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html#loading-qml-objects-from-c

Это пример динамического создания объекта 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();
}
person Victor Yudin    schedule 18.03.2018