Перезагрузка контента QQuickWindow без восстановления окна - PullRequest
0 голосов
/ 03 декабря 2018

Для файла 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 без полного воссоздания окна?Спасибо!

...