在我的应用程序中,我想用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();
如何在单独的窗口中显示它?
答案 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
。此类结合了QQmlEngine
和QQmlComponent
,以便提供加载单个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类型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文件。