天天看点

将C++对象嵌入到带有上下文属性的QML中简述QQmlContext设置简单的上下文属性将对象设置为上下文属性从上下文属性中接收信号

当加载一个 qml 对象到一个 c++ 应用程序中时,直接嵌入可以从 qml 代码中使用的一些 c++ 数据是非常有用的。例如,对嵌入的对象调用一个 c++ 函数,或者使用一个 c++ 对象实例作为 qml 视图的数据模型。

通过 qqmlcontext 类可以将 c++ 数据注入到 qml 对象中。该类将数据暴露给一个 qml 对象的上下文,以便可以直接从 qml 代码中引用数据。

<a href="#%e7%ae%80%e8%bf%b0">简述</a>

<a href="#qqmlcontext">qqmlcontext</a>

<a href="#%e8%ae%be%e7%bd%ae%e7%ae%80%e5%8d%95%e7%9a%84%e4%b8%8a%e4%b8%8b%e6%96%87%e5%b1%9e%e6%80%a7">设置简单的上下文属性</a>

<a href="#%e5%b0%86%e5%af%b9%e8%b1%a1%e8%ae%be%e7%bd%ae%e4%b8%ba%e4%b8%8a%e4%b8%8b%e6%96%87%e5%b1%9e%e6%80%a7">将对象设置为上下文属性</a>

<a href="#%e4%bb%8e%e4%b8%8a%e4%b8%8b%e6%96%87%e5%b1%9e%e6%80%a7%e4%b8%ad%e6%8e%a5%e6%94%b6%e4%bf%a1%e5%8f%b7">从上下文属性中接收信号</a>

qqmlcontext 类定义了 qml 引擎内的上下文,上下文允许将数据暴露给由 qml 引擎实例化的 qml 组件。

每个 qqmlcontext 包含一组属性,允许以名称将数据显式地绑定到上下文。通过调用 qqmlcontext::setcontextproperty() 来定义和更新上下文属性。

相应的接口:

void qqmlcontext::setcontextproperty(const qstring &amp;name, const qvariant &amp;value) 简单的上下文属性,对应的值为 qvariant 类型。 void qqmlcontext::setcontextproperty(const qstring &amp;name, qobject *value) 相对来说稍微复杂一些,qobject * 对象类型。

可以看出,上下文属性可以保存 qvariant 或 qobject * 类型的值。也就是说,既可以使用这种方式注入简单的 qvariant 类型;也可以注入自定义 c++ 对象,并且这些对象可以在 qml 中被直接修改和读取。

将C++对象嵌入到带有上下文属性的QML中简述QQmlContext设置简单的上下文属性将对象设置为上下文属性从上下文属性中接收信号

例如,下面的 qml 文本项,引用了一个当前范围中不存在的 currentdatetime 值:

这个 currentdatetime 值可以由加载 qml 组件的 c++ 应用程序直接设置,使用 qqmlcontext::setcontextproperty():

注意: 由于在特定上下文中评估 qml 中的所有求值表达式,因此如果上下文被修改,则该上下文中的所有绑定都将被重新求值。因此,应该在应用程序初始化之外谨慎使用上下文属性,因为这可能会降低应用程序性能。

修改上述示例,嵌入一个 qobject 实例而非一个 qdatetime 值,并且从 qml 调用对象实例上的一个函数:

注意: 并非所有的 c++ 函数都可以从 qml 调用,除了 q_invokable() 标记的 public 函数之外,还可以是 public 槽函数。

和前面的类似,只不过这里传递的是 qobject * 对象类型:

然后,就可以在 qml 中使用 applicationdata:

注意: 从 c++ 到 qml 返回的 date/time 可以通过 qt.formatdatetime() 和相关函数进行格式化。

如果 qml 需要从上下文属性中接收信号,可以使用 connections 类型进行连接。

上面的日期时间是固定不变的,我们来为其添加一个定时器(每秒更新),让时间跑起来:

将C++对象嵌入到带有上下文属性的QML中简述QQmlContext设置简单的上下文属性将对象设置为上下文属性从上下文属性中接收信号

例如,applicationdata 具有一个名为 datachanged() 的信号,在定时器超时后发射:

在 qml 中,定义一个 connections 对象,将该信号连接至一个名为 ondatachanged 的处理程序:

其中 target 为目标对象,也就是我们的上下文属性 applicationdata。

继续阅读