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