QMetaMethod 獲取成員函式的元資訊

2021-07-30 02:03:01 字數 1619 閱讀 6038

而要得到乙個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()所期望的。

下面,我們以乙個例項來使用一下該類:

新建乙個qt控制台程式,再新建乙個qobject的子類,在該類中宣告乙個槽函式。**如下:

#ifndef myobject_h

#define myobject_h

#include class myobject : public qobject

;#endif // myobject_h

然後,在main函式中,我們列印出add槽函式的元資訊。**如下:

int main(int argc, char *argv)

執行結果如下:

可以結合qmetamethod中相關的列舉型別定義來理解上面的輸出。

enum access 

enum methodtype

即,該方法的訪問許可權為public,型別是slot,其他的都很好理解了。

當然,上面說了,我們可以使用該類的invoke()函式,在已有的物件上,呼叫該函式。**如下:

int result = 0;

bool bcall = metamethod.invoke(&obj, q_return_arg(int, result), q_arg(int, 1), q_arg(int, 1));

if(bcall)

大家可以自行測試一下結果。

QMetaMethod 獲取成員函式的元資訊

導言 最近在深入理解乙個專案的demo時,有乙個難點困惑了整整乙個上午,就是關於qmetamethod類的使用。檢視了官方的手冊,懵懵懂懂。蒐羅了網上的相關介紹,總算是有些明白了。接著,我就來分享下我的總結吧!介紹 qmetamethod類是用來獲取成員方法的元資訊的乙個類。通過該類,我們可以獲取到...

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...