从 C++ 代码创建单独的 QML window

Create separate QML window from C++ code

在我的应用程序中,我想使用 C++ 代码中的 QML UI 创建另一个 window。

我知道可以使用 QML Window 类型创建另一个 window,但我需要 C++ 代码中的相同内容。

到目前为止,我设法将我的附加 qml 文件加载到 QQmlComponent 中:

QQmlEngine engine;
QQmlComponent component(&engine);
component.loadUrl(QUrl(QStringLiteral("qrc:/testqml.qml")));
if ( component.isReady() )
    component.create();
else
    qWarning() << component.errorString();

如何在单独的 window 中显示它?

您可以尝试新建QQmlEngine

您可以使用单个 QQmlEngine 来实现。按照您的代码,您可以执行以下操作:

QQmlEngine engine;
QQmlComponent component(&engine);
component.loadUrl(QUrl(QStringLiteral("qrc:/main.qml")));

if ( component.isReady() )
    component.create();
else
    qWarning() << component.errorString();

component.loadUrl(QUrl(QStringLiteral("qrc:/main2.qml")));

if ( component.isReady() )
    component.create();
else
    qWarning() << component.errorString();

不过我更喜欢QQmlApplicationEngine。此 class 结合了 QQmlEngineQQmlComponent 以提供加载单个 QML 文件的便捷方式。因此,如果您有机会使用 QQmlApplicationEngine.

,您的代码行会更少

示例:

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
engine.load(QUrl(QStringLiteral("qrc:/main2.qml")));

return app.exec();

我们也可以使用 QQuickViewQQuickView 只支持加载从 QQuickItem 派生的根对象,所以在这种情况下我们的 qml 文件不能以 QML 类型 ApplicationWindowWindow 开头在上面的例子中。所以在这种情况下,我们的 main 可能是这样的:

QGuiApplication app(argc, argv);

QQuickView view;
view.setSource(QUrl("qrc:/main.qml"));
view.show();

QQuickView view2;
view2.setSource(QUrl("qrc:/main2.qml"));
view2.show();

return app.exec();

对于任何好奇的人,我最终用稍微不同的方法解决了这个问题。

我的根 QML 文档现在看起来像这样:

import QtQuick 2.4

Item {
    MyMainWindow {
        visible: true
    }

    MyAuxiliaryWindow {
        visible: true
    }
}

其中 MainWindow 是具有根元素 ApplicationWindow 的 QML 组件,AuxiliaryWindow 是具有根元素 Window.

的组件

工作正常,您不必担心加载两个单独的 QML 文件。