В нашем проекте у нас есть модульные тесты C ++ для источников QML. Он использует следующий код для динамической загрузки компонента для дальнейшей обработки
class MyTest {
...
QScopedPointer<QQuickWidget> quickWidget;
QQuickItem* root = nullptr;
void setQmlSource(const QString& source)
{
quickWidget.reset(new QQuickWidget);
quickWidget->rootContext()->engine()->addImportPath("qrc:/qml");
quickWidget->setSource(QUrl::fromUserInput(source));
root = quickWidget->rootObject();
}
}
Работает нормально для таких компонентов qml:
my.qml:
Rectangle {
...
}
Однако, когда я завернул компонент в Dialog
Dialog {
...
Rectangle {
...
}
}
, он перестал работать:
Ошибка: QQuickWidget
поддерживает только загрузку root объектов, которые являются производными от QQuickItem
.
. Ожидается, что Dialog
является QQuickWindow
. Однако при попытке загрузить QQuickItem
через QQuickView
вот так https://doc.qt.io/qt-5/qquickview.html#details:
void MyTest::setQmlWindow(const QString& source)
{
QQuickView *view = new QQuickView;
view->rootContext()->engine()->addImportPath("qrc:/qml");
view->setSource(QUrl::fromUserInput(source));
root = view->rootObject();
}
Сбой также с вышеуказанной ошибкой. И загрузка через QQmlApplicationEngine
как здесь { ссылка }:
void MyTest::setQmlWindow(const QString& source)
{
engine = new QQmlApplicationEngine;
//engine->addImportPath("qrc:/qml");
engine->load(QUrl::fromUserInput(source));
QObject *myObject = engine->rootObjects().first();;
QQuickWindow *window = qobject_cast<QQuickWindow*>(myObject);
root = window->contentItem();
}
завершается с ошибкой:
QQmlApplicationEngine
не удалось загрузить компонент
QWARN: MyTest::myMethodTest()
модуль "mynamespace.mymodule
" не установлен
QWARN: MyTest::myMethodTest()
модуль "mynamespace.mymodule
" не установлен
...
Почему view->setSource()
правильно загружает эти модули для элемента Rectangle
, а QQmlApplicationEngine
не удается выполнить для того же источника qml элемента, но помещен в Dialog
?
Примечание: эти модули являются C ++ и прекрасно работают с view->setSource()
.
Если я пытаюсь использовать и загружать через QQmlComponent
как упоминается в документации: https://doc.qt.io/qt-5/qqmlcomponent.html#details:
void MyTest::setQmlWindow(const QString& source)
{
engine = new QQmlApplicationEngine;
//engine->addImportPath("qrc:/qml");
QQmlComponent *component = new QQmlComponent(engine, QUrl::fromUserInput(source));
component->loadUrl(QUrl::fromUserInput(source));
QQuickWindow *window = qobject_cast<QQuickWindow*>(component->create());
root = window->contentItem();
}
- , а затем есть другая ошибка:
QQmlComponent
: компонент не готов
, если engine->addImportPath()
не вызывается, и cra sh с
Lo c: [Неизвестный файл (0)]
ошибка при вызове engine->addImportPath()
.
Как правильно загрузить Dialog
(QQuickWindow
) и получить root QQuickItem
в C ++ для тестирования? Любые идеи? Спасибо!