[static] bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0 = QGenericArgument( Q_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())
调用对象obj上的成员(信号或槽名)。如果该成员可以被调用,则返回true。如果没有这样的成员或参数不匹配,则返回false。
参数一:被调用对象的指针
参数二:方法的名字
参数三:连接类型,,可以指定连接类型,来取决于是同步还是异步的。
Qt::DirectConnection,该成员将立即被调用。
Qt::QueuedConnection,会发送一个QEvent,并在应用程序进入主事件循环后立即调用该成员。
Qt::BlockingQueuedConnection,将以与Qt::QueuedConnection相同的方式调用该方法,除了当前线程将阻塞,直到事件被传递。 使用这种连接类型在同一线程中的对象之间进行通信将导致死锁。
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引用。
QGenericArgument Q_ARG(Type, const Type &value)
该宏接受类型名称和该类型的值,并返回一个QGenericArgument对象,该对象可以传递给QMetaObject::invokeMethod()。
QGenericReturnArgument Q_RETURN_ARG(Type, Type &value)
该宏接受类型名称和该类型值的非const引用,并返回一个QGenericReturnArgument对象,该对象可以传递给QMetaObject::invokeMethod()。
只需要将信号或槽的名称传递给这个函数,而不是整个签名。 例如,要异步调用QThread上的quit()槽,使用以下代码:
QMetaObject::invokeMethod(thread, "quit", Qt::QueuedConnection);
对于异步方法调用,参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将它们存储在一个事件中。如果尝试使用排队的连接并收到错误消息:
QMetaObject::invokeMethod: Unable to handle unregistered datatype 'MyType' 。
在调用invokeMethod()之前调用qRegisterMetaType()来注册数据类型。
同步调用某个任意对象上的compute(QString, int, double)槽,获取其返回值:
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));