QMetaMethod 獲取成員函式的元資訊

2021-10-03 17:34:24 字數 2872 閱讀 6484

導言:

最近在深入理解乙個專案的demo時,有乙個難點困惑了整整乙個上午,就是關於qmetamethod類的使用。檢視了官方的手冊,懵懵懂懂。蒐羅了網上的相關介紹,總算是有些明白了。接著,我就來分享下我的總結吧!

介紹:

qmetamethod類是用來獲取成員方法的元資訊的乙個類。

通過該類,我們可以獲取到乙個成員方法的型別,比如它是訊號、槽、方法、建構函式;

也可以獲得方法的完整簽名,以及方法所接受的引數型別和引數名字;

當然也可以獲取方法的返回值型別;

還可以使用access()方法獲取成員函式的訪問許可權。

當然,最重要的還是invoke()方法,使用該方法我們可以在任意的qobject物件上呼叫成員函式。

而要得到乙個qmetamethod類的例項,有如下方法:

對於訊號,可以使用該類的靜態方法fromsignal()來獲得相對於該訊號的qmetamethod物件;

對於普通成員函式和槽函式,可以使用類的qmetaobject物件來間接獲取。分別舉例如下:

方法一qmetamethod destroyedsignal = qmetamethod::fromsignal(&qobject::destroyed);

方法二qstring retval;

qbytearray normalizedsignature = qmetaobject::normalizedsignature(「compute(qstring, int, double)」);

int methodindex = obj->metaobject()->indexofmethod(normalizedsignature);

qmetamethod method = obj->metaobject()->method(methodindex);

method.invoke(obj,

qt::directconnection,

q_return_arg(qstring, retval),

q_arg(qstring, 「sqrt」),

q_arg(int, 42),

q_arg(double, 9.7));

其中,要使用qmetaobject::normalizedsignature()來規範化函式簽名,確保方法簽名是invoke()所期望的。

看到這裡的時候,大家還是會很困惑,如何理解invoke()方法,使用該方法我們可以在任意的qobject物件上呼叫成員函式。

現在我來舉乙個例子:

qbytearray normalizedsignature = qmetaobject::

normalizedsignature

("cirlesolve(int)");

int methodindex = obj.

metaobject()

->

indexofmethod

(normalizedsignature)

; qmetamethod metamethod = obj.

metaobject()

->

method

(methodindex)

;qdebug()

<<

"access: "

<< metamethod.

access()

;qdebug()

<<

"valid: "

<< metamethod.

isvalid()

;qdebug()

<<

"index: "

<< metamethod.

methodindex()

;qdebug()

<<

"signature: "

<< metamethod.

methodsignature()

;qdebug()

<<

"type: "

<< metamethod.

methodtype()

;qdebug()

<<

"name: "

<< metamethod.

name()

;qdebug()

<<

"parameter names: "

<< metamethod.

parameternames()

;qdebug()

<<

"parameter types: "

<< metamethod.

parametertypes()

;qdebug()

<<

"return type: "

<< metamethod.

returntype()

;qdebug()

<<

"type name: "

<< metamethod.

typename()

;//int result = 0;

bool bcall = metamethod.

invoke

(&obj, qt:: autoconnection,

q_arg

(int,42

));if

(bcall)

輸出:

可以看到,qmetaobject物件obj 獲取到了槽函式的相關資訊,並且通過invoke ()函式實現了對 槽函式circlesolve(int)的呼叫,將「」42」的值傳入,並進行計算。

QMetaMethod 獲取成員函式的元資訊

而要得到乙個qmetamethod類的例項,有如下方法。對於訊號,可以使用該類的靜態方法fromsignal 來獲得相對於該訊號的qmetamethod物件 對於普通成員函式和槽函式,可以使用類的qmetaobject物件來間接獲取。分別舉例如下 方法一qmetamethod destroyedsi...

QMetaMethod 獲取成員函式的元資訊

而要得到乙個qmetamethod類的例項,有如下方法。對於訊號,可以使用該類的靜態方法fromsignal 來獲得相對於該訊號的qmetamethod物件 對於普通成員函式和槽函式,可以使用類的qmetaobject物件來間接獲取。分別舉例如下 方法一qmetamethod destroyedsi...

獲取成員函式的指標

今天的話題比較有意思,如何獲取乙個非 static 成員函式的指標?考慮以下 c class a void a foo void 也就是說,如何獲取 a foo 的指標?那位說了 這有何難?乙個 typedef 全搞定!c typedef void a fooptr void fooptr func...