QT 5 新语法之信号重载问题

QT 4 Q T   4 中,关联信号和槽比较常用的是(这里信号用 valueChanged() v a l u e C h a n g e d ( ) ,槽用 setValue() s e t V a l u e ( ) 演示):

connect(sender, SIGNAL(valueChanged(int)), receiver, SLOT(setValue(int)));

这里使用的 SIGNAL S I G N A L SLOT S L O T 是可以将参数转换为字符串的两个宏,但是这里存在两个问题——没有编译期检查和无法使用相容类型的参数,所以在 QT 5 Q T   5 中提供了新的信号槽语法(因为向下兼容,所以旧的语法也是可以用的)。

前面演示的关联用 QT 5 Q T   5 的新语法写如下:

connect(sender, &Sender::valueChanged, receiver, &Receiver::setValue);

这里, Sender S e n d e r sender s e n d e r 对象的类型, Receiver R e c e i v e r receiver r e c e i v e r 对象的类型。

这样写不止解决了上述的问题,还允许链接到任意函数。不过这样也引入了一些坑,新手(比如说我)在使用新语法的时候总会在编译期报如下类似错误(支持编译期检查的优点这么快就体现出来了 /(o)/~~ /(ㄒoㄒ)/~~

这里提示没有匹配到这个函数,没有匹配到的原因是因为第二个参数没有解释清楚重载类型……其实这是因为信号重载产生了歧义导致的,在旧的语法中,因为会指定参数类型,所以不会出现这个问题,但是在新的语法中并没有指定参数类型,所以遇见重载时就栽了。

报错中显示我用的的 QSpinBox Q S p i n B o x ,而这个类中定义了两个名字叫 valueChanged v a l u e C h a n g e d 的信号:

void valueChanged(int);
void valueChanged(const QString &);

所以我们需要在使用的时候指定清楚调用哪个重载的信号,这时候就轮到 static_cast<>() s t a t i c _ c a s t <> ( ) 出场了!

首先我们先看一下上述错误代码如何修改:

connect(ui->spinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &TimeLine::SendSignalsFrameChanged);

其次,我们来说一下 static_cast<>() s t a t i c _ c a s t <> ( ) ,这是一个强制转换的函数,原型是:

static_cast<type-id>(expression)

功能是将 expression e x p r e s s i o n 强制转换为 typeid t y p e − i d 类型,但是它没有运行时类型检查来保证转换的安全性。

具体其他用法可以参考 《百度百科: static_cast s t a t i c _ c a s t ……

所以在使用这个函数转换以后,便可以明确表明 valueChanged v a l u e C h a n g e d 信号使用的是哪个重载,问题也随之解决。

全部评论

相关推荐

原来已经一年了,因为没有加任何实验室没有学长学姐带,再一次偶然的机会下刷到我们学校的牛肉哥,和他聊天之后发现他也没加实验室能进大厂,我就燃起了希望,去年大概&nbsp;4&nbsp;月份找好路线&nbsp;零基础&nbsp;开始学&nbsp;5&nbsp;月背八股和开始刷算法很难受&nbsp;7-8&nbsp;月焦虑躯体化害怕找不到实习&nbsp;9&nbsp;月找到一家像样的小厂去实习了&nbsp;4&nbsp;个月大三上期末考试结束之后&nbsp;1&nbsp;月份回来边实习边准备工作压力很大&nbsp;当时只有字节、百度、商汤的面试,字节三面挂了,百度&nbsp;oc,商汤&nbsp;二面挂(差评&nbsp;无效面试),之后来深圳百度实习之后还是觉得不甘心一直没把算法和八股扔下一直在准备,百度实习的时候&nbsp;mt&nbsp;交给我一个特别重要的工作数据库迁移(特别感谢&nbsp;mt&nbsp;,这个需求学到了很多东西处理了一堆线上问题),本来看着暑期他们面试都很困难,然后听说百度要涨实习薪资(然而&nbsp;5&nbsp;月并没有涨),就想着留在百度吧也懒得面试了,4&nbsp;月&nbsp;20&nbsp;多的时候字节&nbsp;hr&nbsp;打电话约面问我要不要尝试一下询问了&nbsp;1&nbsp;月份三面为啥会挂有没有学习&nbsp;ai&nbsp;知识(因为字节这边后端岗位偏&nbsp;ai),我来到百度之后全面拥抱&nbsp;AI&nbsp;也认识了我的好兄弟&nbsp;X&nbsp;哥,他在百度&nbsp;XX&nbsp;部门&nbsp;Agent&nbsp;实习,他属于是我&nbsp;Agent&nbsp;的启蒙老师,来百度之后一直在了解&nbsp;AI&nbsp;这一块,我就接受了字节的面试,一面的时候&nbsp;20&nbsp;分钟实习拷打然后突然说&nbsp;30&nbsp;分钟代码考核我心就凉了以为是&nbsp;kpi,算法题是手撕高并发安全下的令牌桶限流器,我写了整整&nbsp;80&nbsp;多行代码最后也写出来了,但是从来没看到过出这种题能&nbsp;oc&nbsp;的我也就不管了,后边面试也是很顺利但是流程有点长可能一直在横向吧总结结果是好的!!!感谢这一年努力的自己和遇到的各位互联网大佬分享的知识!!!ps&nbsp;图二纯感慨&nbsp;(觉得🍬请不要喷我)欢迎大家一起交流学习呀!!!!
点赞 评论 收藏
分享
04-15 20:51
门头沟学院 Java
纳斯卡可:把名字改一下吧 千万级用户你真测过吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务