关于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));