关于QButtonGroup 在Qt5和Qt6之间的差异

关于QButtonGroup 在Qt5和Qt6之间的差异

缘由

最近有个需求需要使用qt来实现,由于太久没有用了,便借鉴了一下别人的代码。没想到出师未捷身先死,在使用 QButtonGroup 时,当使用信号槽进行连接时,报错了。该文就顺便记录一下,为什么错,已经如何修改。

开始

我的 qt 环境为:

os version: manjaro

qt version: 6.10.1

参考的代码如下:

c++ 复制代码
connect(&btnGroup, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
            ui->stackedWidget, &QStackedWidget::setCurrentIndex);

上面代码用于将 QButtonGroup 的点击事件与 QStackedWidget 的设置当前索引进行连接,此时,运行代码,出现错误 no matching function for call to 'makeCallableObject<void (QButtonGroup::*)(QAbstractButton*)>(void (QStackedWidget::*)(int))'

分析

根据报错,可以看出,是因为我们信号槽没有匹配到 QButtonGroup 存在 buttonClicked(int) 的函数,通过查看官方文档,可以看到如下图:

对于当前版本中的确实不存在 void buttonClicked(int) 的信号了,但是多出了一个 void idClicked(int id) 的信号

所以,将上面的代码修改成如下所示,即可正常工作:

c++ 复制代码
connect(&btnGroup, &QButtonGroup::idClicked,
        ui->stackedWidget, &QStackedWidget::setCurrentIndex);

疑惑

此时我又好奇了,为什么参考代码会需要这么写呢?

我查询了官方文档,我看到了在 qt6 之前的版本对于 QButtonGroup 的信号定义如下图:

上面这个是 qt5 中的信号方法定义,看到这个我就能理解了

在 qt5 中,因为 QButtonGroup 存在两个同名函数的重载,导致使用信号槽连接时,找不到对应的信号,所以需要进行绑定。

这里顺便扩充一下常用的绑定方法:

1、使用 QOverload 进行信号转换

c++ 复制代码
connect(&btnGroup, QOverload<int>::of(&QButtonGroup::buttonClicked),
            ui->stackedWidget, &QStackedWidget::setCurrentIndex);

2、使用静态转换 static_cast

c++ 复制代码
connect(&btnGroup, static_cast<void (QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
            ui->stackedWidget, &QStackedWidget::setCurrentIndex);

3、使用qt4的信号与槽连接方式

c++ 复制代码
connect(&btnGroup, SIGNAL(buttonClicked(int)),
            ui->stackedWidget, SLOT(setCurrentIndex));
相关推荐
2601_962071573 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水4 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero5 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-6 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
黑马程序员毕设8 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
_Twink1e8 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen
问天_观心8 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
阿里嘎多学长8 小时前
2026-09-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
大丑哥9 小时前
QT QML 中实现高亮功能
qt
源代码•宸9 小时前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang