widgetObject有操函数Test:
void Test(int *v);
在线程中调用Test,会被忽略,实际不会调用。
QMetaObject::invokeMethod(widgetObject, "Test", Qt::QueuedConnection, Q_ARG(int*,&v));
下面是网上找的理由:
在同一个线程中
当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象;(测试时,打印传递前后的地址不同) 引用传递不会复制对象;(测试时,打印传递前后的地址相同)
不在同一个线程中
当信号和槽不在同一个线程中时,分两种情况。 1、connect时使用AutoConnection(跨线程默认是QueuedConnection):值传递参数和引用传递参数没有区别,都会复制对象;(测试时,打印传递前后的地址不同) 2、connect时使用DirectConnection,测试结果和在同一线程中的结果相同。
emit发射信号 在信号中以&引用作为参数
以引用作为参数一定要注意,在第二次发射信号的时候,引用的实体已经不存在了。
所以,如果想让每一次发射的信号中参数的值都保存下来,不能是&引用和*指针作为参数,而应该使用值传递。
这样每次发射信号的值都能够保存下来。
可以通过把指针保存到一个值类型中,例如:
struct IntPointer { int * Val; };
通过IntPointer传递
标签:调用,Qt,程中,传递,参数,引用,Test,线程 From: https://www.cnblogs.com/SamFang/p/17605291.html