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

3

在我的应用程序中,我想从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个回答

6
您可以使用单个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文件不能以ApplicationWindowWindow等QML类型开头,就像上面的示例一样。 因此,在这种情况下,我们的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();

1
感谢你的回答。那么,如果我将“Window”或“ApplicationWindow” QML类型用作我的QML的根元素,我就可以使用第二种解决方案了。我猜这就是我没有意识到的事情 - 我原以为我应该以某种方式从C++创建窗口。现在我明白了,QML才是王道。 - Aleksei Petrenko
你说得对 :) QQmlApplicationEngine 不会自动创建根窗口。在阅读了你的消息后,我认为更新我的答案并提供另一个选项是个好主意:使用 QQuickView。在这种情况下,正如你所知,QQuickView 仅支持加载从 QQuickItem 派生的根对象。 - Tarod
1
由于某些原因,您使用一个QQmlApplicationEngine和两个加载的文件的解决方案对我不起作用,第二个窗口就是不会显示出来。也许这是我的代码中的一些错误。无论如何,我已经找到了更好的方法来解决这个问题(在我的情况下),并将其发布为另一个答案。无论如何,感谢您的帮助! - Aleksei Petrenko
很抱歉听到这个消息:( 如果您想看到代码运行或者只是想玩一下,我已经将代码上传到GitHub。无论如何,我看到了你的新答案,它很棒! :) - Tarod

1
你可以尝试创建一个新的 QQmlEngine。

0

对于任何感兴趣的人,我最终采用了稍微不同的方法来解决这个问题。

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

import QtQuick 2.4

Item {
    MyMainWindow {
        visible: true
    }

    MyAuxiliaryWindow {
        visible: true
    }
}

MainWindow 是一个带有根元素 ApplicationWindow 的 QML 组件,而 AuxiliaryWindow 则是一个带有根元素 Window 的组件。

这样做非常好,您不必担心加载两个单独的 QML 文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接