关于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));
相关推荐
代码游侠10 小时前
应用——Linux FrameBuffer图形显示与多线程消息系统项目
linux·运维·服务器·开发语言·前端·算法
hqwest10 小时前
码上通QT实战09--监控页面01-区域划分
开发语言·qt·layout·qss·qt 布局
我命由我1234510 小时前
Kotlin 面向对象 - 装箱与拆箱
android·java·开发语言·kotlin·android studio·android jetpack·android-studio
大、男人10 小时前
python之Callable
开发语言·python
cly110 小时前
使用 JAR 包部署 Java 应用(以 NginxWebUI 为例)
java·开发语言·jar
有什么东东10 小时前
java-枚举类、抽象类、接口、内部类
java·开发语言
bxlj_jcj10 小时前
使用 Arthas + Heapdump + MAT 三步定位 Java 内存泄漏
java·开发语言·python
大猫和小黄10 小时前
Java ID生成策略全面解析:从单机到分布式的最佳实践
java·开发语言·分布式·id