从C++代码创建单独的 QML 窗口



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

我知道可以使用QML窗口类型创建另一个窗口,但是我需要从C++代码中获取相同的内容。

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

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

如何在单独的窗口中显示它?

您可以使用

单个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。此类结合了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();

您可以尝试创建新的 QQmlEngine

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

我的根 QML 文档现在如下所示:

import QtQuick 2.4
Item {
    MyMainWindow {
        visible: true
    }
    MyAuxiliaryWindow {
        visible: true
    }
}

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

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

相关内容

  • 没有找到相关文章

最新更新