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 信号使用的是哪个重载,问题也随之解决。

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442570次浏览 4512人参与
# 春招别灰心,我们一人来一句鼓励 #
41986次浏览 533人参与
# 北方华创开奖 #
107437次浏览 599人参与
# 地方国企笔面经互助 #
7964次浏览 18人参与
# 同bg的你秋招战况如何? #
76743次浏览 563人参与
# 实习必须要去大厂吗? #
55775次浏览 961人参与
# 阿里云管培生offer #
120264次浏览 2220人参与
# 虾皮求职进展汇总 #
115687次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11584次浏览 287人参与
# 实习,投递多份简历没人回复怎么办 #
2454714次浏览 34857人参与
# 提前批简历挂麻了怎么办 #
149906次浏览 1977人参与
# 在找工作求抱抱 #
906025次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4757次浏览 55人参与
# 你投递的公司有几家约面了? #
33206次浏览 188人参与
# 投递实习岗位前的准备 #
1195950次浏览 18549人参与
# 机械人春招想让哪家公司来捞你? #
157635次浏览 2267人参与
# 双非本科求职如何逆袭 #
662248次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12734次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35815次浏览 384人参与
# 简历中的项目经历要怎么写? #
86920次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20133次浏览 240人参与
# 我的上岸简历长这样 #
452024次浏览 8088人参与
牛客网
牛客企业服务