简介
QMetaObject::invokeMethod是一个静态函数,用于在Qt信号槽机制之外,异步调用QObject子类的公开槽函数或者调用任意可调用对象。主要处理不同线程异步调用或延时操作。
参数
bool QMetaObject::invokeMethod(QObject *obj,
const char *member,
Qt::ConnectionType type = Qt::AutoConnection,
QGenericReturnArgument ret = QGenericReturnArgument(),
QGenericArgument val0 = QGenericArgument(),
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());
- obj:调用槽函数的对象指针。
- member:槽函数的名字,以字符串的方式。
- type:连接类型,默认为
Qt::AutoConnection
,可以根据需要选择Qt::DirectConnection
(直接连接,同步调用)或Qt::QueuedConnection
(队列连接,异步调用) - ret:返回值,需要用QGenericReturnArgument包装。
- val:槽函数的参数,需要用QGenericArgument包装。
示例:
void test(); //无参数
bool testSlot(int value); //带参数
//异步执行test函数
QMetaObject::invokeMethod(this, "test", Qt::QueuedConnection);
int arg = 666;
QGenericArgument argVa1("value", &arg);
QGenericReturnArgument ret("result", &returnValue);
QMetaObject::invokeMethod(myObject,"testSlot",Qt::QueuedConnection,ret,argVa1);
注意:
调用槽函数时,必须确保被调用的对象存在且它所在的线程已经进入了事件循环(GUI线程就是事件循环线程)。如果不在GUI现场,则需要保证对象的生命周期足够长,知道参函数被调用完成为止。