QT 按钮单选互斥并取消抬起


前言

最近有项目要求,要求按钮组需要单选互斥,并再次点击之后能够取消,但是在调用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;
}




总结

能力和时间有限,只能暂时想出这个办法,大佬们有更好的办法欢迎补充!!!

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li_Zhi_Yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值