Новый объект qml добавлен в сцену в C++

У меня проблема с добавлением нового объекта QML в существующую сцену.

мой main.qml источник:

ApplicationWindow    
{
id:background
visible: true
width: 640
height: 480
}

MyItem.qml источник:

Rectangle 
{
width: 100
height: 62
color: "red"
anchors.centerIn: parent
}

Наконец, вот мой main.cpp источник:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QQmlComponent *component = new QQmlComponent(&engine);
    component->loadUrl(QUrl("qrc:/MyItem.qml"));

    qDebug() << "component.status(): "<< component->status();

    QObject *dynamicObject  = component->create();
    if (dynamicObject == NULL) {
        qDebug()<<"error: "<<component->errorString();;
    }

    return app.exec();
}

main.qml отображается правильно, но MyItem.qml не появляется внутри main.qml, Component.status() возвращает состояние Readyошибок нет dynamicObject, Что я делаю неправильно?

2 ответа

Вам нужно указать родительский элемент для элемента, иначе он не является частью визуальной иерархии и не будет отображаться.

Я думаю, что вы должны использовать QQuickView вместо QQmlEngine, main.cpp было бы:

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQuickView view;
    view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    view.show();

    QQmlComponent component(view.engine(), QUrl("qrc:/MyItem.qml"));

    QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
    item->setParentItem(view.rootObject());
    QQmlEngine::setObjectOwnership(item, QQmlEngine::CppOwnership);

    return app.exec();
}

И вам нужно изменить main.qml введите от ApplicationWindow в Item

Item
{
    id:background
    visible: true
    width: 640
    height: 480
}

Это проще, и таким образом вы можете создать класс, который расширяет QQuickView и который управляет созданием ваших новых предметов.

Другие вопросы по тегам