之前一直只知道用connect把信号和槽连接起来用,看别人的代码一直没看到connect,但是信号又确实调用了。。。。
现在知道可以这个方法调用一个函数、槽或者信号
原型是:[static] 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())
还挺长的,第一个参数是被调用对象的指针
第二个参数是方法、信号或槽的名称
第三个参数是调用的类型,有同步调用和异步调用
第四个参数是接收被调用函数的返回值;注意,如果调用是异步的,则无法计算返回值
QGenericArgument和QGenericReturnArgument是内部帮助器类。由于可以动态调用信号和插槽,因此必须使用Q_ARG()和Q_RETURN_ARG()宏来封装参数。Q_ARG()接受类型名称和该类型的常量引用;Q_RETURN_ARG()接受类型名和非常量引用。
也就是接收的参数需要用Q_ARG()或Q_RETURN_ARG()封装起来,最多接收9个参数
You only need to pass the name of the signal or slot to this function, not the entire signature. For example, to asynchronously invoke the quit() slot on a QThread, use the following code:
只需要将信号或插槽的名称传递给此函数,而不需要传递整个签名。例如,要异步调用QThread上的quit()插槽,可以使用以下代码:
QMetaObject::invokeMethod(thread, "quit",Qt::QueuedConnection);