天天看點

将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。

繼續閱讀