关于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));
相关推荐
小康小小涵3 小时前
基于ESP32S3实现无人机RID模块底层源码编译
linux·开发语言·python
lzjava20243 小时前
Python的函数
开发语言·python
Awesome Baron3 小时前
skill、tool calling、MCP区别
开发语言·人工智能·python
Python私教3 小时前
GenericAgent PySide6 桌面应用深度解析:悬浮按钮 + 聊天面板的原生 Qt 方案
开发语言·数据库·qt
矢志航天的阿洪3 小时前
用 MATLAB 控制 STK Aviator:从零搭建一个 AWACS 支援作战场景
开发语言·matlab
用户805533698034 小时前
现代Qt开发教程(新手篇)1.11——定时器
c++·qt
澈2074 小时前
STL迭代器:容器遍历的万能钥匙
开发语言·c++
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试
geovindu5 小时前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
27669582925 小时前
阿里最新acw_sc__v2 分析
开发语言·python·acw_sc__v2·acw_sc__v2逆向·acw_sc__v2算法·acw_sc__v2算法分析·cookie逆向