从 C++ 代码创建单独的 QML window
Create separate QML window from C++ code
在我的应用程序中,我想使用 C++ 代码中的 QML UI 创建另一个 window。
我知道可以使用 QML Window 类型创建另一个 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();
如何在单独的 window 中显示它?
您可以尝试新建QQmlEngine
您可以使用单个 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
。此 class 结合了 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();
对于任何好奇的人,我最终用稍微不同的方法解决了这个问题。
我的根 QML 文档现在看起来像这样:
import QtQuick 2.4
Item {
MyMainWindow {
visible: true
}
MyAuxiliaryWindow {
visible: true
}
}
其中 MainWindow
是具有根元素 ApplicationWindow
的 QML 组件,AuxiliaryWindow
是具有根元素 Window
.
的组件
工作正常,您不必担心加载两个单独的 QML 文件。
在我的应用程序中,我想使用 C++ 代码中的 QML UI 创建另一个 window。
我知道可以使用 QML Window 类型创建另一个 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();
如何在单独的 window 中显示它?
您可以尝试新建QQmlEngine
您可以使用单个 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
。此 class 结合了 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();
对于任何好奇的人,我最终用稍微不同的方法解决了这个问题。
我的根 QML 文档现在看起来像这样:
import QtQuick 2.4
Item {
MyMainWindow {
visible: true
}
MyAuxiliaryWindow {
visible: true
}
}
其中 MainWindow
是具有根元素 ApplicationWindow
的 QML 组件,AuxiliaryWindow
是具有根元素 Window
.
工作正常,您不必担心加载两个单独的 QML 文件。