关于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));
相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript