QML UnitTest отсутствует свойство контекста C++

Я нашел этот старый пост, который сталкивается с той же проблемой: как смоделировать компонент QML

К сожалению, нет решения. Резюмируя проблему: у меня есть QMLTestCase который импортирует модуль. Но этот модуль опирается на свойство корневого контекста, которое обычно добавляется в main.cpp, Так как это TestCaseЯ не имею никакого влияния на то, как QQmlApplicationEngine запускает.

Как я могу добавить отсутствующее свойство контекста?

2 ответа

Если ваш модуль полагается на свойство корневого контекста, вам следует подумать о создании подключаемого модуля c++ для QML с использованием QQmlEngineExtensionPlugin

Создание подключаемых модулей C++ для QML

Если вы посмотрите на реализацию, вам нужно будет заново реализовать следующую функцию:

      void initializeEngine(QQmlEngine *engine, const char *uri) override;

Как говорится в документации:

Инициализирует расширение из uri с помощью движка. Здесь подключаемый модуль приложения может, например, предоставлять QML некоторые данные или объекты в качестве свойств контекста в корневом контексте движка.

В этой функции вы можете поместить необходимое свойство корневого контекста

      void initializeEngine(QQmlEngine *engine, const char *uri) override
{
  MyObject* object = new MyObject(engine->rootContext());
  engine->rootContext()->setContextProperty("myProperty", object);
}

После этого вам просто нужно импортировать модуль QML в файл QML, в котором определен TestCase, и вам не нужно будет использовать какие-либо основные функции для добавления этого объекта в качестве свойства корневого контекста.

Редактировать:

В Qt 5.11 есть новая глава в Qml UnitTesting. Смотрите главу Выполнение C++ перед тестами QML.

Предыдущий ответ:

Вы можете получить экземпляр QQmlEngine, передав элемент QML стороне C++, где вы можете использовать метод qmlEngine.

Таким образом, вы можете установить свойство контекста, вызвав

qmlEngine(passedQmlItem)->rootContext()->setContextProperty("propertyName", propertyValue);
Другие вопросы по тегам