Qt中使用含std::vector<int>的结构体触发QObject connect参数队列错误如何解决
问题原因
Qt的信号槽在使用Qt::QueuedConnection队列连接(默认跨线程连接就会采用该类型)时,传递的所有参数类型都需要被Qt元对象系统注册,才能被序列化存入事件队列,供接收方线程后续读取。你贴出的纯STL逻辑的main函数不会触发该错误,报错来自你未贴出的Qt信号槽代码,提示的QVector类型未注册,说明你在信号/槽参数中使用了装载自定义Grid类型的QVector,或是直接传递Grid类型时存在隐式转换到QVector的逻辑。
解决方案
- 首先确认自定义结构体满足元类型注册要求:需要有公有的默认构造函数、拷贝构造函数、析构函数,你当前定义的
Grid已经满足该要求。 - 在
Grid结构体定义的全局作用域下添加Q_DECLARE_METATYPE宏声明,让Qt元系统可以识别该类型:
struct Grid { std::vector<int> indices; int pt_count{}; Grid()=default; ~Grid()=default; void add_indice(int _indice) { indices.push_back(_indice); pt_count++; } }; // 新增下方宏声明 Q_DECLARE_METATYPE(Grid)
- 在main函数中
QApplication初始化完成后、对应信号槽连接执行前,注册对应类型到元系统:- 如果信号槽传递的参数是单个
Grid对象:
qRegisterMetaType<Grid>();- 如果信号槽传递的参数是
QVector<Grid>:
qRegisterMetaType<QVector<Grid>>(); - 如果信号槽传递的参数是单个
注意:如果你的
Grid结构体定义在自定义命名空间内,宏声明和注册操作都需要补全命名空间前缀。
内容的提问来源于stack exchange,提问作者avinash bhat
相关产品推荐
相关产品推荐

