7

我发现这篇较旧的帖子面临同样的问题:How to mock a QML component

不幸的是,没有解决方案。回顾一下这个问题:我有一个导入模块的QML 。TestCase但是这个模块依赖于一个根上下文属性,该属性通常会添加到main.cpp. 由于这是一个,我对如何启动TestCase没有影响。QQmlApplicationEngine

如何添加缺少的上下文属性?

4

2 回答 2

1

如果您的模块依赖于根上下文属性,您应该考虑使用 QQmlEngineExtensionPlugin 为 QML 创建一个 c++ 插件

为 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,您无需使用任何主要函数将此对象添加为根上下文属性。

于 2021-02-08T23:28:44.963 回答
0

编辑:

在 Qt 5.11 中,Qml UnitTesting 有了新的篇章。请参阅在 QML 测试之前执行 C++一章 。

上一个答案:

您可以通过将 QML 项目传递给 C++ 端来获取 QQmlEngine 的实例,您可以在其中使用方法qmlEngine

因此,您可以通过调用设置上下文属性

qmlEngine(passedQmlItem)->rootContext()->setContextProperty("propertyName", propertyValue);
于 2016-06-28T13:00:38.173 回答