0

我需要动态创建一个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());

我可以访问QQmlApplicationEnginein main.cpp

问题:如何添加dynamic_quick_item到我的项目main.qml?我想从 C++ 端动态添加dynamic_quick_item到我的项目列表中。main.qml

它不需要添加到main.qml. 只想将 a 添加QQuickItem到 mymain.qml中定义的 QML 项目列表中,这与main.qml. 有没有可能的方法来实现这一点?

更新:执行以下操作应该获得QQuickItem我添加的有效实例。但它没有

QQuickItem *my_dynamic_quickitem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("DynamicQuickItemObject");

我得到my_dynamic_quickitemnull 这意味着我创建的 QQuickItem 从未被添加

4

1 回答 1

0

可以使用 QQmlComponent 动态加载 QML 项。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();
}
于 2018-03-18T18:23:05.483 回答