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);