Для файла qml с элементом Item
в качестве корня сцены qml:
Item {
...
}
можно предварительно просмотреть qml
содержимое файла с QQuickView
без воссоздания окна - см. Соответствующие слегка измененные и упрощенныеqmlscene
код:
QQmlEngine engine;
QPointer<QQmlComponent> component = new QQmlComponent(&engine);
QQuickWindow *window = nullptr;
auto qxView = new QQuickView(&engine, nullptr);
...
// Call this slot on file update (for example by QFileSystemWatcher signal)
updatePreview()
{
// Recreate Qml Component
engine.clearComponentCache();
component = new QQmlComponent(&engine);
component->loadUrl(url);
QObject *topLevel = component->create();
// Recreate Quick Window
window = qobject_cast<QQuickWindow *>(topLevel);
if (window) {
engine.setIncubationController(window->incubationController());
} else {
QQuickItem *contentItem = qobject_cast<QQuickItem *>(topLevel);
if (contentItem) {
window = qobject_cast<QQuickWindow *>(qxView);
delete qxView->rootObject(); // Clear old root object before setting new one
qxView->setContent(url, component, contentItem);
}
}
}
Для такой qml
файловой структуры window
становится nullptr
при быстром восстановлении окна и выполнение переходит к else
пути оператора if
.И там мы используем один экземпляр QQuickView
- qxView
, просто изменяя его содержимое без полной перезагрузки и восстановления.
BTW , QQuickView::setContent()
не документирован, но используется в qmlscene
.
Однако, если файл qml
содержит ApplicationWindow
в качестве корневого элемента сцены:
ApplicationWindow {
...
}
выполнение идет по 1-му варианту воссоздания Quick Window:
engine.setIncubationController(window->incubationController());
и создан новый экземпляр QQuickWindow
, который занимает гораздо больше времени и вынуждает нас уничтожить и закрыть предыдущий.
Возможно ли аналогично QQuickView
перезагрузить содержимое сцены для QQuickWindow
без полного воссоздания окна?Спасибо!