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

时间:2016-02-01 10:08:36

标签: c++ qt qml qtquick2 qqmlcomponent

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

我知道可以使用QML 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();

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

3 个答案:

答案 0 :(得分:4)

您可以使用单个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类型ApplicationWindow或{{1}开头就像上面的例子中一样。所以在这种情况下,我们的Window可能是这样的:

main

答案 1 :(得分:1)

您可以尝试创建新的QQmlEngine

答案 2 :(得分:0)

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

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

import QtQuick 2.4

Item {
    MyMainWindow {
        visible: true
    }

    MyAuxiliaryWindow {
        visible: true
    }
}

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

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