在我的应用程序中,我想从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
。此类结合了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
或Window
开头。所以在这种情况下,我们的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文件。