Qt线程之间通过signal和slot传递数据
这种方法主要是为了设置自己定义的数据类型,在不同的线程之间进行通信。如果自己定义的数据类型未经处理之间传递会报如下错误:
QObject::connect: Cannot queue arguments of type 'TextAndNumber' (Make sure 'TextAndNumber' is registed using qRegisterMetaType().)
当一个signal被放到队列中(queued)时,它的参数(arguments)也会被一起一起放到队列中(queued起来),这就意味着参数在被传送到slot之前需要被拷贝、存储在队列中(queue)中;为了能够在队列中存储这些参数(argument),Qt需要去construct、destruct、copy这些对象,而为了让Qt知道怎样去作这些事情,参数的类型需要使用qRegisterMetaType来注册。
当自己定义的数据需要在线程之间传递的时候,需要加上以下几个步骤,以自己定义的数据类型 std::vector 为例。
①包含头文件 #include
②在头文件末尾,#endif上面加入声明 Q_DECLARE_METATYPE(std::vector)
③在main()函数中去注册这种数据类型。qRegisterMetaType