3

In my application I want to create another window with QML UI from C++ code.

I know it's possible to create another window using QML Window type, but I need the same thing from C++ code.

So far I managed to load my additional qml file into QQmlComponent:

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

How do I display it in a separate window?

4

3 回答 3

5

您可以使用单个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();

我们也可以使用QQuickView. QQuickView仅支持加载派生自的根对象,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();
于 2016-02-01T13:06:08.307 回答
1

你可以尝试新建QQmlEngine

于 2016-02-01T10:13:51.693 回答
0

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

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

import QtQuick 2.4

Item {
    MyMainWindow {
        visible: true
    }

    MyAuxiliaryWindow {
        visible: true
    }
}

whereMainWindow是具有根元素的 QML 组件,ApplicationWindow并且AuxiliaryWindow是具有根元素的组件Window

工作得很好,您不必担心加载两个单独的 QML 文件。

于 2016-02-03T07:57:46.857 回答