qt -- invokeMethod介绍

[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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值