前言
最近有项目要求,要求按钮组需要单选互斥,并再次点击之后能够取消,但是在调用setAutoExclusive设置互斥或将按钮添加到按钮组之后,clicked进入槽之后,isChecked状态一直是true,并且调用setChecked(false)没用,网上搜不到,只能自己动手了,顺便记录一下
一、效果图
废话不多说,看图说话(好像录制效果不太好,有些是双击了,勉强凑合)
二、具体实现
1.设计师界面配置
配置如下图所示:
2.源码
代码如下(示例),简单点就放到构造函数里面了,注释够详细了,看不懂也没办法:
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->buttonGroup, QOverload<int>::of(&QButtonGroup::buttonClicked),
[=](int id){
static int s_iLastId = -1;
if(id == s_iLastId)
{
// exclusive:此属性保存按钮组是否是互斥的,如果此属性为真,则在任何给定时间只能选中按钮组中的一个按钮。
// 用户可以单击任何按钮来选中它,该按钮将替换现有的按钮作为选中的按钮。
// 在一个排他组中,用户不能通过点击取消当前选中的按钮;相反,必须单击该组中的另一个按钮来设置该组的新选中按钮。默认情况下,此属性为true。
ui->buttonGroup->setExclusive(false); // 先取消互斥
ui->buttonGroup->button(id)->setChecked(false);
ui->buttonGroup->setExclusive(true); // 再设置互斥
s_iLastId = -1; // 取消之后,重置标志位
// .....代码处理
}
else
{
s_iLastId = id; // 保存最后一次点击的标志位,用于下次判断是否点击同一个按钮
// ....代码处理
}
});
}
MainWindow::~MainWindow()
{
delete ui;
}
总结
能力和时间有限,只能暂时想出这个办法,大佬们有更好的办法欢迎补充!!!