信号与槽的参数如果是自定义参数,需要注册

背景:一个线程通过signal-slot发送PVCI_CAN_OBJ类型的值到主线程中,

错误提示:

QObject::connect: Cannot queue arguments of type 'PVCI_CAN_OBJ'

(Make sure 'PVCI_CAN_OBJ' is registered using qRegisterMetaType().)

原因:在线程中通过signal-slot传递信息时,参数默认放到队列中的,但PVCI_CAN_OBJ是自定义的参数,不是Qt自带的参数结构。

解决方法:

一、将不识别的参数结构进行注册,让Qt能够识别。

 包含头文件

#include <QMetaType>在构造函数中调用其方法完成注册:

qRegisterMetaType<PVCI_CAN_OBJ>("PVCI_CAN_OBJ");//注册PVCI_CAN_OBJ类型

二、使用QVariant

struct myStruct
{
  int a;
  float b;
};
Q_DECLARE_METATYPE(myStruct);

然后以QVariant代替自定义的结构体

connect(this, SIGNAL(m_signal(QVariant)), this, SLOT(m_slot(QVariant)));

在发射信号前,将自定义结构体打包为QVariant

myStruct mstruct;
QVariant data;
data.setValue(mstruct);
emit signal_child(data);

在槽函数中,解析QVariant

myStruct mstruct = data.value<myStruct>();
原文地址:https://www.cnblogs.com/judes/p/6958941.html