Используйте QQuickView или QQmlApplicationEngine для переключения между страницами из ApplicationWindow

Я хотел бы использовать ApplicationWindow как основной файл и иметь возможность переключаться на другие QML файлы из C++ с QQuickView::setSource(const QUrl & url), В основном это сделало бы это:

запуск => загружает main.qml (ApplicationWindow) => нажмите на кнопку справки => C++ загружает файл help.qml => и т. д.

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

    view.setSource(QUrl{"qrc:/main.qml"});
    view->show();

    return app.exec();
}

main.qml

ApplicationWindow
{
    visible: true
    width: 640
    height: 480

    Loader
    {
        anchors.fill: parent
        id: mainPageLoader
    }

    Button
    {
        text: "Help"
        onClicked: { mainPageLoader.source = "help.qml"}
    }
}

(Мне интересно, если Loader вот тут действительно надо)

тем не мение QQuickView поддерживает только загрузку корневых объектов, производных от QQuickItem, Поэтому он не работает с ApplicationWindow,

Я думаю об использовании QQmlApplicationEngine вместо QQuickView но использование кажется другим, этот класс оснащен только QQmlApplicationEngine::load(const QUrl & url)

Какой будет лучший курс действий для моей цели? Мне действительно нужно ApplicationWindow в моем файле main.qml?

1 ответ

Решение

Использование QQmlApplicationEngine как вы предлагаете, и с main.qml как вы говорите, но установите свойство контекста из C++ с URL страницы содержимого, например help.qml - затем привязать к этому свойству контекста в свойстве источника Загрузчика.

Это нормальный способ управления QML из C++ - предоставление свойств контекста или одноэлементных объектов со свойствами, извлечение их из C++ и привязка QML к изменениям.

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