使用 QQuickView 或 QQmlApplicationEngine 在 ApplicationWindow 的页面之间切换

Use QQuickView or QQmlApplicationEngine to switch between pages from ApplicationWindow

我想使用 ApplicationWindow 作为主文件,并能够从 C++QQuickView::setSource(const QUrl & url) 切换到其他 QML 文件。基本上它会这样做:

启动 => 加载 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但是用法似乎不同,这个class只配备了QQmlApplicationEngine::load(const QUrl & url)

对我来说最好的行动方案是什么?我的 main.qml 文件中真的需要 ApplicationWindow 吗?

按照您的建议使用 QQmlApplicationEngine,并按照您所说的使用 main.qml,但使用内容页面 URL 从 C++ 设置上下文 属性,例如help.qml - 然后在 Loader 的源 属性.

中绑定到此上下文 属性

这是从 C++ 控制 QML 的正常方法 - 公开上下文属性或具有属性的单例对象,从 C++ 驱动它们,并让 QML 绑定响应更改。