QMetaMethod 获取成员函数的元信息
導言:
最近在深入理解一個項目的Demo時,有一個難點困惑了整整一個上午,就是關于QMetaMethod類的使用。查看了官方的手冊,懵懵懂懂。搜羅了網上的相關介紹,總算是有些明白了。接著,我就來分享下我的總結吧!
介紹:
QMetaMethod類是用來獲取成員方法的元信息的一個類。
通過該類,我們可以獲取到一個成員方法的類型,比如它是信號、槽、方法、構造函數;
也可以獲得方法的完整簽名,以及方法所接受的參數類型和參數名字;
當然也可以獲取方法的返回值類型;
還可以使用access()方法獲取成員函數的訪問權限。
當然,最重要的還是invoke()方法,使用該方法我們可以在任意的QObject對象上調用成員函數。
而要得到一個QMetaMethod類的實例,有如下方法:
方法一
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對象上調用成員函數。
現在我來舉一個例子:
在上一篇我的博文《Qt 控制臺 使用connect連接信號和槽》中,已經提到了信號和槽的使用,
這里我們在main()中補充如下代碼:
輸出:
可以看到,QMetaObject對象obj 獲取到了槽函數的相關信息,并且通過invoke ()函數實現了對 槽函數circleSolve(int)的調用,將“”42”的值傳入,并進行計算。
更多關于QMetaObject對象的介紹,可以參考官方的help手冊。
總結
以上是生活随笔為你收集整理的QMetaMethod 获取成员函数的元信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 控制台 使用connect连接信号
- 下一篇: QtGraphicView添加图元