关于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));
相关推荐
小程故事多_805 小时前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
沐知全栈开发5 小时前
SQL 日期处理指南
开发语言
黎雁·泠崖6 小时前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
黎雁·泠崖6 小时前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言
独好紫罗兰6 小时前
对python的再认识-基于数据结构进行-a006-元组-拓展
开发语言·数据结构·python
C++ 老炮儿的技术栈6 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
yuuki2332336 小时前
【C++】继承
开发语言·c++·windows
222you6 小时前
Redis的主从复制和哨兵机制
java·开发语言
牛奔6 小时前
如何理解 Go 的调度模型,以及 G / M / P 各自的职责
开发语言·后端·golang
梵刹古音6 小时前
【C++】 析构函数
开发语言·c++