Qml中呼叫C 類的三種方式詳解(一)

2021-10-09 03:32:49 字數 2751 閱讀 6748

第一步:新建乙個類,qmlcpp

qmlcpp.**件:

#ifndef qmlcpp_h

#define qmlcpp_h

#include class qmlcpp : public qobject

;#endif // qmlcpp_h

可以看出首先使用q_invokable這個巨集修飾了兩個成員函式。

官方文件中的描述:

翻譯:將此巨集應用於成員函式的宣告,以允許它們通過元物件系統被呼叫,巨集將在返回型別之前寫入。

q_invokable這個巨集是將函式申明為元物件系統可呼叫的函式。

qtquick 也在元物件系統中,這樣就可以在qtquick中可以訪問到這2個c++的函式了。

第二步:在main.cpp中進行註冊:

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

, qt::queuedconnection);

engine.load(url);

}

我們將 qmlcpp 的標頭檔案引用進來,然後定義乙個 qmlcpp 類的例項,呼叫設定整型的函式,並將這個 c++ 例項註冊到 qml 引擎上下文中標示為 「qmlcpp」 的名字, 這樣 qml 中就可以通過 qmlcpp 來訪問這個 c++ 例項。

第三步:在qml檔案中進行呼叫:

import qtquick 2.12

import qtquick.controls 2.12

item

}button

}}

其中在上述**中,最關鍵的步驟是第二步,所以仔細來看一下第二步 在main.cpp中是是如何進行註冊的:

通過官方描述得知是用來載入qml檔案的。

qmlcpp qmlcpp;          // 先初始化乙個類的例項

qmlcpp.setvalue(898); // 設初值

// 將這個 c++ 例項註冊到 qml 引擎上下文中標示為 「qmlpro」 的名字, 這樣 qml 中就可以通過 qmlpro 來訪問這個 c++ 例項。

engine.rootcontext()->setcontextproperty("qmlpro",&qmlcpp);

接著初始化了乙個例項qmlcpp,呼叫setvalue()函式。

engine.rootcontext() 返回的是乙個引擎的根上下文,返回的是  qqmlcontext 型別指標;

engine.rootcontext()->setcontextproperty("qmlpro",&qmlcpp);

設定根上下文 屬性名為 「qmlpro」的值為 乙個指標,該指標指向qmlcpp這個例項。

之後再qml中直接使用 qmlpro 呼叫2個公共函式。

button

}

但是要直接訪問 c++類中的屬性,還需要使用到q_property,

#ifndef qmlcpp_h

#define qmlcpp_h

#include #include #include class qmlcpp : public qobject

;#endif // qmlcpp_h

c++類中新增一行**:

q_property(int value read getvalue write setvalue notify valuechange)
這行**的意思是:定義乙個名稱為value的屬性,讀取屬性的函式是getvalue,寫入屬性的函式是setvalue,屬性發生變化時觸發的訊號是valuechange。

所以在類中又新增了乙個訊號:

void valuechange();
然後就可以在qml檔案中直接訪問這個value:

button

}

因為c++類中的槽函式本身就在元物件系統中,而我們已經把qmlcpp註冊到元物件系統中,所以qml可以直接對qmlcpp類中槽函式進行呼叫;

第一步:現在qmlcpp類中新建乙個槽函式,addvalue()

void qmlcpp::addvalue(int nvalue)

在qml檔案中直接呼叫:

button

}

至此,這篇部落格講述了如何在qml檔案中訪問 c++類的 成員函式、資料成員、槽函式的基本步驟。

1.先將自定義的c++類註冊到元物件系統中。

2.使用q_invokable巨集修飾 類的成員函式。

3.使用q_property這個巨集來定義 屬性的名稱 讀取、寫入、以及值發生變化所觸發的訊號。

4.直接呼叫槽函式。

C 類中的三種繼承方式

public 可以被任意實體訪問 protected 只允許子類及本類的成員函式訪問 private 只允許本類的成員函式訪問 public繼承 protect繼承 private繼承 基類中繼承方式子類中 public public繼承 public public protected繼承 prot...

C 呼叫WebService的三種方式

本文介紹webservice的三種呼叫方式,直接引用,引用wsdl和soap請求三種方式。第一種是直接引用,這個適用於開發者可以直接訪問到webservice的情況,直接引用會自動生成引用 在引用 新增服務引用 高階 新增web引用,直接輸入webservice位址點新增引用即可。新增完成後會自動生...

C 中類的三種繼承方式比較

c 中類的三種繼承方式比較 1 公有繼承 public繼承 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然為私有的,不能被這個派生類的子類所訪問。2 保護繼承 proteced繼承 保護繼承的特點是基類的所有公有成員和保護成員都作為派生類的保護...