日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QMetaMethod 获取成员函数的元信息

發布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QMetaMethod 获取成员函数的元信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導言:

最近在深入理解一個項目的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對象上調用成員函數。

    現在我來舉一個例子:

    在上一篇我的博文《Qt 控制臺 使用connect連接信號和槽》中,已經提到了信號和槽的使用,
    這里我們在main()中補充如下代碼:

    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){qDebug() << "the area of obj " << obj.getArea();}

    輸出:

    可以看到,QMetaObject對象obj 獲取到了槽函數的相關信息,并且通過invoke ()函數實現了對 槽函數circleSolve(int)的調用,將“”42”的值傳入,并進行計算。

    更多關于QMetaObject對象的介紹,可以參考官方的help手冊。

    總結

    以上是生活随笔為你收集整理的QMetaMethod 获取成员函数的元信息的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。