【问题标题】:QML UnitTest missing C++ context propertyQML UnitTest 缺少 C++ 上下文属性
【发布时间】:2016-01-09 03:20:47
【问题描述】:

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

很遗憾,没有解决方案。回顾一下这个问题: 我有一个 QML TestCase 导入一个模块。但是这个模块依赖于root context property,它通常会被添加到main.cpp中。因为这是TestCase,所以我无法影响QQmlApplicationEngine 的启动方式。

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

【问题讨论】:

    标签: qt unit-testing qml qtquick2 qqmlapplicationengine


    【解决方案1】:

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

    Creating C++ Plugins for 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,您无需使用任何主要函数来添加它 对象作为根上下文属性。

    【讨论】:

      【解决方案2】:

      编辑:

      在 Qt 5.11 中,Qml UnitTesting 有了新的篇章。见章节 Executing C++ Before QML Tests.

      上一个答案:

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

      所以,你可以通过调用来设置上下文属性

      qmlEngine(passedQmlItem)->rootContext()->setContextProperty("propertyName", propertyValue);
      

      【讨论】:

        猜你喜欢
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多