我发现这篇较旧的帖子面临同样的问题:How to mock a QML component
不幸的是,没有解决方案。回顾一下这个问题:我有一个导入模块的QML 。TestCase
但是这个模块依赖于一个根上下文属性,该属性通常会添加到main.cpp
. 由于这是一个,我对如何启动TestCase
没有影响。QQmlApplicationEngine
如何添加缺少的上下文属性?
我发现这篇较旧的帖子面临同样的问题:How to mock a QML component
不幸的是,没有解决方案。回顾一下这个问题:我有一个导入模块的QML 。TestCase
但是这个模块依赖于一个根上下文属性,该属性通常会添加到main.cpp
. 由于这是一个,我对如何启动TestCase
没有影响。QQmlApplicationEngine
如何添加缺少的上下文属性?
如果您的模块依赖于根上下文属性,您应该考虑使用 QQmlEngineExtensionPlugin 为 QML 创建一个 c++ 插件
如果您查看实现,您将需要重新实现以下功能:
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 有了新的篇章。请参阅在 QML 测试之前执行 C++一章 。
上一个答案:
您可以通过将 QML 项目传递给 C++ 端来获取 QQmlEngine 的实例,您可以在其中使用方法qmlEngine。
因此,您可以通过调用设置上下文属性
qmlEngine(passedQmlItem)->rootContext()->setContextProperty("propertyName", propertyValue);