В моем приложении я хочу создать другое окно с QML UI из кода C ++.
Я знаю, что можно создать другое окно, используя тип окна 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
является компонентом QML с корневым элементом ApplicationWindow
а также AuxiliaryWindow
является компонентом с корневым элементом Window
,
Работает просто отлично, и вам не нужно беспокоиться о загрузке двух отдельных файлов QML.