一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

不跨线程的话,使用自定义的类型使用signal/slot来传递,没有什么问题。

但如果是跨线程的使用,则没有这么简单。

 

直接使用的话,会产生下面这种错误:(假定自定义类为MyClass)
QObject::connect: Cannot queue arguments of type 'MyClass' (Make sure 'MyClass' is registed using qRegisterMetaType().)
实际运行中也会发现,该信号槽没有起作用。

 

其实解决方法在错误提示中已经给出了:Make sure 'MyClass' is registed using qRegisterMetaType().
即使用qRegisterMetaType()将自定义类型进行注册

 

这里总结使用方法如下:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include <QMetaType>,构造函数中加入代码:qRegisterMetaType<MyClass>("Myclass");
3、Myclass的引用类型需单独注册:qRegisterMetaType<MyClass>("Myclass&");

 

如果不实用这种方法,还有一种办法来使跨线程的signal/slot起作用,即使用connect函数的Qt::DirectConnection参数

connect(A,SIGNAL(sendA(MyClass)),B,SLOT(getA(MyClass)),Qt::DirectConnection);

但此方法官方不推荐使用,认为其不安全。不过在笔者实际使用过程中,未发现有不妥之处。

posted on   一杯清酒邀明月  阅读(3240)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2021-01-06 VTK 体绘制_体绘制管线&图形渲染管线
2021-01-06 VTK 图形基本操作进阶_纹理映射
2021-01-06 VTK 图形基本操作进阶_点云配准技术(迭代最近点ICP算法)
2021-01-06 VTK 图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)
2021-01-06 VTK 图形基本操作进阶_表面重建技术(三维点云曲面重建)
2021-01-06 VTK 图形基本操作进阶_表面重建技术(等值面提取)
2021-01-06 VTK 图形基本操作进阶_表面重建技术(三角剖分)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示