導言:
最近在深入理解乙個專案的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...