Несколько QQuickWidgets с одним QQmlEngine
У меня проблема и надеюсь, что вы мне поможете.
У меня есть несколько QQmlWidgets, где разные экземпляры одинаковых компонентов должны быть показаны. Компоненты создаются во время выполнения и используют определенные свойства из родительского виджета. Проблема в том, что в этих компонентах есть несколько вложенных элементов, поэтому они загружаются очень медленно. Я решил загрузить их все в QQmlEngine на этапе предварительной загрузки приложения, а затем просто создать их при необходимости. Таким образом, все мои QQmlWidgets получили один и тот же QQmlEngine и тот же корневой контекст. Чтобы отличать свойства разных виджетов, я создаю каждый экземпляр компонента в отдельном контексте (по одному на каждый QQmlWidget). После создания я устанавливаю родительский элемент вновь созданного объекта в корневой элемент QQmlWidget; Проблема в том, что на динамически создаваемые объекты ссылаются на корневой элемент, и они не могут его найти. Можете ли вы предложить какое-либо решение? Я выкладываю упрощенную версию своего кода ниже.
// main.cpp
QQmlEngine* e = new QQmlEngine;
QWidget* ww1 = new QWidget;
QWidget* ww2 = new QWidget;
QQuickWidget* w1 = new QQuickWidget(e, ww1);
QQuickWidget* w2 = new QQuickWidget(e, ww2);
w1->setSource(QUrl::fromLocalFile("main.qml"));
w2->setSource(QUrl::fromLocalFile("main.qml"));
QQmlComponent* comp = new QQmlComponent(e, "comp.qml");
QQmlContext* c1 = new QQmlContext(e);
QQmlContext* c2 = new QQmlContext(e);
QQuickItem* it1 = qobject_cast<QQuickItem*>(comp->create(c1));
it1->setParentItem(w1->rootObject());
QQuickItem* it2 = qobject_cast<QQuickItem*>(comp->create(c2));
it2->setParentItem(w2->rootObject());
ww1->show();
ww2->show();
//main.qml
Rectangle {
id: root
}
//comp.qml
Rectangle {
anchors.top : root.top
}
Ошибка:
comp.qml - ReferenceError: root is not defined
Заранее спасибо.
1 ответ
Когда компонент загружается, родитель не устанавливается и становится установленным только после вызова setParentItem
метод. Это можно исправить установкой привязки при смене родителя.
// comp.qml
Rectangle {
onParentChanged: { anchors.top = parent.top; }
}