QML與C 的整合

2021-08-07 12:56:56 字數 2984 閱讀 2391

qml引擎與qt的元物件系統的整合,使得qml中可以直接呼叫c++的功能。

只有qobject子類才能夠將資料或者函式提供給qml使用。由於qml引擎整合了qt元物件系統,由qobject派生的所有子類的屬性、方法和訊號燈都可以在qml中訪問。

除了可以從qml中訪問c++的功能,在qt qml模組中也提供了多種方式從c++**中操作qml物件。

qt qml模組提供的一些實現了qml框架的c++類。客戶端可以使用這些類與qml進行時進行互動(如向物件注入資料,或者呼叫物件方法),並且從qml文件例項化乙個物件樹狀結構。

qml應用程式構成乙個qml客戶端,在啟動時候,客戶端會初始化乙個qqmlengine類作為qml引擎,然後使用qqmlcomponent物件載入qml文件。

qml引擎會提供乙個預設的qqmlcontext物件作為頂層執行上下文,用來執行qml文件中定義的函式和表示式。這個上下文可以通過qqmlengine::rootcontext()函式獲取,利用qml引擎可以對其進行修改等操作。

engine.load(qurl(qstringliteral("qrc:/")));

//load()函式會自動載入給定的檔案並立即建立檔案中定義的物件樹。

qqmlcontext提供了物件例項化和表示式執行所需要的執行時上下文。所有物件都需要在乙個特定的上下文中例項化,所有表示式都要在乙個特定的上下文中執行。qqmlcontext類在qml引擎中定義了這樣乙個上下文,允許資料暴露給由qml引擎例項化的qml元件。

qqml元件context包含了一系列屬性,能夠通過名字將資料顯式繫結到上下文。可以使用qqmlcontext::setcontextproperty()函式來定義、更新上下文中的屬性。

如:

qqmlengine engine;

qstringlistmodel modeldata;

qqmlcontext * context=engine.rootcontext();

context->setcontextproperty ("stringmodel",&modeldata);

//qqmlcontext物件作為頂層執行上下文,用來執行qml文件中定義的函式或者表示式。

//根上下文建立了乙個新的上下文物件

//這裡是由根上下文建立了乙個新的上下文物件。modeldata被新增到新的上下文中,並且該上下文作為動態建立的元件上下文。以

qqmlengine engine;

qstringlistmodel modeldata;

qqmlcontext * context=

new qqmlcontext(engine.rootcontext());

context->setcontextproperty("stringmodel",&modeldata);

qqmlcomponent component(&engine);

component.setdata("import qtquick 2.2\nlistview"",qurl());

qobject *window=component.create(context);

動態執行表示式。qqmlexpression允許客戶端在c++中利用乙個 特定的qml上下文執行js表示式。表示式的執行結果以qvariant形式返回,且遵守qml引擎確定的轉換規則。

如:

import

qtquick 2.2

item

//可以使用下面的c++**,在上下文中執行js表示式

qqmlengine *engine=new qqmlengine;

qqmlcomponent component (engine,qurl::fromlocalfile("main.qml"));

qobject * object=component,create();

qqmlexpression *expr=new qqmlexpression(

engine->rootcontext(),object,"width *2");

int result=expr->evaluate().toint();

qml引擎和元物件系統的緊密整合,qml可以非常方便地通過c++進行擴充套件。qml可以直接訪問qobject子類的屬性、方法和訊號:屬性可以在qml中讀取和修改;方法可以直接通過js呼叫;訊號處理函式則根據訊號自動建立。

使用列舉型別

使用q_enums巨集將列舉註冊到qt元物件系統。

使用c++屬性

qobject子類的所有屬性都能夠被qml訪問。

qobject子類使用q_property巨集定義乙個屬性,該巨集的作用是向qt元物件系統註冊類的屬性。乙個類的屬性就是類的資料成員,通常會有乙個用於讀取的read函式和乙個可選的用於修改的write函式。

class mesage :public qobject

} qstring author() const

signals:

void authorchanged();

private:

qstring m_author;

} ;

在使用時,可以將message類的乙個例項作為載入qml文件myitem.qml的上下文屬性:

int main(int argc,char *argv)

//然後可以在myitem.qml中直接操作author屬性

import qtquck 2.2

text

}

為了盡可能增強與qml的可互動性,任何可寫屬性都應該關聯乙個notify訊號。

如上面屬性author有乙個notify訊號authorchanged()。當setauthor()函式修改了author()屬性時候,該訊號便會發出。

notify訊號的確會產生不小開銷。有些屬性值僅在物件構造時候設定,之後就不會被修改。此時應該使用constrant特性而不是notify。

qml與C 的互動

簡單說下我自己對qml與c 的互動的理解流程 1.介面互動,很多新手可能會寫qt介面或者qml介面,但想要把qml與c 結合起來就一臉矇逼了。首先我提供個簡單的方法實現qml和c 的介面互動,首先引入幾個重要的標頭檔案,當然在專案檔案中需要加qt quickwidgets才能引用以下標頭檔案 inc...

qml與C 的互動

qml與c 的互動,簡單說下我自己對qml與c 的互動的理解流程 1.介面互動,很多新手可能會寫qt介面或者qml介面,但要把qml與c 結合起來就一臉矇逼了。首先我提供個簡單的方法實現qml和c 的介面互動。首先引入幾個重要的標頭檔案 include include include widget ...

玩轉Qml 5 Qml與C 互動

qml訪問c qml已經有很多功能,不過終歸會有不夠用或不適用的地方,需要通過與c 的互動進行功能擴充套件。這回濤哥嘗試把所有qml與c 互動相關的知識點都寫出來,做乙個透徹 全面的總結。玩轉qml 系列文章,配套了乙個優秀的開源專案 taoquick github 訪問不了或者速度太慢,可以用國內...