Qt之QMetaObject::invokeMethod()使用简介
概述
Qt元對象系統是Qt最核心的一個基礎特性,元對象系統負責信號和插槽對象間通信機制、運行時類型信息和Qt屬性系統。為應用程序中使用的每個QObject子類創建一個QMetaObject實例,此實例存儲QObject子類的所有元信息。通過元對象系統,你可以查詢QObject的某個派生類的類名、有哪些信號、槽、屬性、可調用方法等信息,然后可以使用QMetaObject::invokeMethod()調用QObject的某個注冊到元對象系統中的方法。而這里,主要就介紹改函數的使用方法,以及大致簡介。
QMetaObject::invokeMethod()
QMetaObject的invokeMethod()方法用來調用一個對象的信號、槽、可調用的方法。這是一個靜態方法,其函數原型如下:
bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret,QGenericArgument val0 = QGenericArgument(nullptr), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(), QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(),QGenericArgument val5 = QGenericArgument(),QGenericArgument val6 = QGenericArgument(), QGenericArgument val7 = QGenericArgument(),QGenericArgument val8 = QGenericArgument(),QGenericArgument val9 = QGenericArgument())在最新的Qt5.13中,QMetaObject中的invokeMethod函數一共有五個,除上面這個以外其他都是重載函數,就不一一介紹。
該函數就是調用obj對象中的member方法,如果調用成功則返回true,調用失敗則返回false,失敗的話要么就是沒有這個方法要么就是參數傳入不對。
參數介紹
- 第一個參數是被調用對象的指針;
- 第二個參數是方法的名字;
- 第三個參數是連接類型??梢灾付ㄟB接類型,來決定是同步還是異步調用。
- 如果type是Qt :: DirectConnection,則會立即調用該成員。
- 如果type是Qt :: QueuedConnection,則會發送一個QEvent,并在應用程序進入主事件循環后立即調用該成員。
- 如果type是Qt :: BlockingQueuedConnection,則將以與Qt :: QueuedConnection相同的方式調用該方法,除了當前線程將阻塞直到事件被傳遞。使用此連接類型在同一線程中的對象之間進行通信將導致死鎖。
- 如果type是Qt :: AutoConnection,則如果obj與調用者位于同一個線程中,則會同步調用該成員; 否則它將異步調用該成員。
- 第四個參數接收被調用函數的返回值;注意,如果調用是異步的,則無法計算返回值。
注意:傳入的參數是有個數限制的,可以向成員函數傳遞最多十個參數(val0,val1,val2,val3,val4,val5,val6,val7,val8和val9)。
QGenericArgument和QGenericReturnArgument是內部幫助程序類。由于可以動態調用信號和槽,因此必須使用Q_ARG()和Q_RETURN_ARG()宏來封裝參數。Q_ARG()接受該類型的類型名稱和const引用; Q_RETURN_ARG()接受類型名稱和非const引用。
注意:此功能是線程安全的。
調用示例
假設一個對象有一個槽compute(QString,int,double),返回一個QString對象,那么調用方式如下(同步):
QString retVal; QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,Q_RETURN_ARG(QString, retVal),Q_ARG(QString, "sqrt"),Q_ARG(int, 42),Q_ARG(double, 9.7));假設要異步調用QThread上的quit()槽:
QMetaObject::invokeMethod(thread, "quit", Qt::QueuedConnection);注意,要調用的類型必須是信號、槽,以及Qt元對象系統能識別的類型, 如果不是信號和槽,可以使用qRegisterMetaType()來注冊數據類型。此外,使用Q_INVOKABLE來聲明函數,也可以正確調用。
總結
以上是生活随笔為你收集整理的Qt之QMetaObject::invokeMethod()使用简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt之QObjectCleanupHan
- 下一篇: 《第3选择》学习笔记