將C 物件嵌入到帶有上下文屬性的QML中

2021-09-23 14:52:24 字數 2428 閱讀 1315

當載入乙個 qml 物件到乙個 c++ 應用程式中時,直接嵌入可以從 qml **中使用的一些 c++ 資料是非常有用的。例如,對嵌入的物件呼叫乙個 c++ 函式,或者使用乙個 c++ 物件例項作為 qml 檢視的資料模型。

通過 qqmlcontext 類可以將 c++ 資料注入到 qml 物件中。該類將資料暴露給乙個 qml 物件的上下文,以便可以直接從 qml **中引用資料。

qqmlcontext 類定義了 qml 引擎內的上下文,上下文允許將資料暴露給由 qml 引擎例項化的 qml 元件。

每個 qqmlcontext 包含一組屬性,允許以名稱將資料顯式地繫結到上下文。通過呼叫 qqmlcontext::setcontextproperty() 來定義和更新上下文屬性。

相應的介面:

void qqmlcontext::setcontextproperty(const qstring &name, const qvariant &value)

簡單的上下文屬性,對應的值為 qvariant 型別。

void qqmlcontext::setcontextproperty(const qstring &name, qobject *value)

相對來說稍微複雜一些,qobject * 物件型別。

可以看出,上下文屬性可以儲存 qvariant 或 qobject * 型別的值。也就是說,既可以使用這種方式注入簡單的 qvariant 型別;也可以注入自定義 c++ 物件,並且這些物件可以在 qml 中被直接修改和讀取。

例如,下面的 qml 文字項,引用了乙個當前範圍中不存在的 currentdatetime 值:

// main.qml

import qtquick 2.3

rectangle

}

這個 currentdatetime 值可以由載入 qml 元件的 c++ 應用程式直接設定,使用 qqmlcontext::setcontextproperty():

// main.cpp

#include

#include

#include

int main(int argc, char *ar**)

注意:由於在特定上下文中評估 qml 中的所有求值表示式,因此如果上下文被修改,則該上下文中的所有繫結都將被重新求值。因此,應該在應用程式初始化之外謹慎使用上下文屬性,因為這可能會降低應用程式效能。

修改上述示例,嵌入乙個 qobject 例項而非乙個 qdatetime 值,並且從 qml 呼叫物件例項上的乙個函式:

#include

#include

class

qobject

};注意:並非所有的 c++ 函式都可以從 qml 呼叫,除了 q_invokable() 標記的 public 函式之外,還可以是 public 槽函式。

和前面的類似,只不過這裡傳遞的是 qobject * 物件型別:

// main.cpp

#include

#include

int main(int argc, char *ar**)

// main.qml

import qtquick 2.3

rectangle

}

如果 qml 需要從上下文屬性中接收訊號,可以使用 connections 型別進行連線。

上面的日期時間是固定不變的,我們來為其新增乙個定時器(每秒更新),讓時間跑起來:

};在 qml 中,定義乙個 connections 物件,將該訊號連線至乙個名為 ondatachanged 的處理程式:

// main.qml

import qtquick 2.3

rectangle

connections }}

Flask 的上下文物件

上下文 相當於乙個容器,儲存了flask程式執行過程中的一些資訊。flask中有兩種上下文,請求上下文和應用上下文。request和session都屬於請求上下文物件。request 封裝了http請求的內容,針對的是http請求。舉例 user request.args.get user 獲取的是...

觸發層疊上下文的CSS屬性

層疊上下文,又稱stacking context,是指元素在垂直於螢幕的z軸上的排列布局。其中影響層疊上下文的屬性包括以下幾種 1.flex元素的子元素,同時z index不是auto 2.opacity值不為1的元素 3.transform值不為none的元素 4.position值為relati...

flask的請求上下文request物件

flask從客戶端收到請求時,要讓檢視函式能訪問請求物件request 才能處理請求。我們可以將request物件作為引數傳到試圖函式裡,比如 from flask import flask,request def hello world request 在這裡將request物件作為引數傳進來 d...