qt — создать отдельное окно QML из кода C ++

В моем приложении я хочу создать другое окно с 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();

Как мне отобразить это в отдельном окне?

3

Решение

Вы можете добиться этого, используя один 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();
4

Другие решения

Вы можете попробовать создать новый QQmlEngine

1

Для любого любопытного я решил проблему немного другим подходом.

Мой корневой документ QML теперь выглядит так:

import QtQuick 2.4

Item {
MyMainWindow {
visible: true
}

MyAuxiliaryWindow {
visible: true
}
}

куда MainWindow является компонентом QML с корневым элементом ApplicationWindow а также AuxiliaryWindow является компонентом с корневым элементом Window,

Работает просто отлично, и вам не нужно беспокоиться о загрузке двух отдельных файлов QML.

1
По вопросам рекламы [email protected]