而要得到乙個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
執行結果如下:
可以結合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 獲取成員函式的元資訊
而要得到乙個qmetamethod類的例項,有如下方法。對於訊號,可以使用該類的靜態方法fromsignal 來獲得相對於該訊號的qmetamethod物件 對於普通成員函式和槽函式,可以使用類的qmetaobject物件來間接獲取。分別舉例如下 方法一qmetamethod destroyedsi...
QMetaMethod 獲取成員函式的元資訊
導言 最近在深入理解乙個專案的demo時,有乙個難點困惑了整整乙個上午,就是關於qmetamethod類的使用。檢視了官方的手冊,懵懵懂懂。蒐羅了網上的相關介紹,總算是有些明白了。接著,我就來分享下我的總結吧!介紹 qmetamethod類是用來獲取成員方法的元資訊的乙個類。通過該類,我們可以獲取到...
獲取成員函式的指標
今天的話題比較有意思,如何獲取乙個非 static 成員函式的指標?考慮以下 c class a void a foo void 也就是說,如何獲取 a foo 的指標?那位說了 這有何難?乙個 typedef 全搞定!c typedef void a fooptr void fooptr func...