QButtonGroup 和按钮焦点事件

文章描述了一个问题,即在标准的按钮组中,由于排他性和选择性,焦点事件无法在按钮间正常跳转。为了解决这个问题,作者创建了一个名为CButtonGroup的自定义控件,该控件模仿按钮组的行为并支持通过键盘方向键控制焦点在按钮间的切换。CButtonGroup类包括添加按钮、设置默认选中按钮以及处理焦点变化的函数。
摘要由CSDN通过智能技术生成

问题: 想要键盘方向键控制 按钮组里面的按钮选择状态跳转发现焦点事件进入后就无法触发了。查了一下因为设置排他和选择状态时,只能选中唯一一个按钮,所有焦点事件跳转不到其他按钮上。

解决方法: 直接写一个类似按钮组的控件来模仿里面的排他功能,并且可以方向键控制焦点状态在按钮里面跳转

、、头文件

#include <QObject>
#include <QButtonGroup>
#include <QFocusEvent>
#include <QAbstractButton>
#include <QKeyEvent>
#include <QEvent>


class CButtonGroup : public QObject
{
    Q_OBJECT
public:
    explicit CButtonGroup(QObject *parent = nullptr);
    void addButton(QAbstractButton *button, int id = -1);
    void setDefaultCheck(QAbstractButton *button);
private slots:
    void changeCurrentCheck();
private:
    QAbstractButton *m_curCheckBtn{nullptr};
};

cpp

#include "CButtonGroup.h"


CButtonGroup::CButtonGroup(QObject *parent)
    : QObject(parent)
{
}


void CButtonGroup::addButton(QAbstractButton *button, int id)
{
    if (NULL == button)
    {
        return;
    }
    connect(button, &QAbstractButton::clicked, this, &CButtonGroup::changeCurrentCheck);
}


void CButtonGroup::setDefaultCheck(QAbstractButton *button)
{
    button->setFocus();
    button->setChecked(true);
    m_curCheckBtn = button;
}


void CButtonGroup::changeCurrentCheck()
{
    QAbstractButton *button = qobject_cast<QAbstractButton*>(sender());
    if ( m_curCheckBtn == button || NULL == button)
    {
      return;
    }
    if (NULL != m_curCheckBtn)
    {
      m_curCheckBtn->setChecked(false);
    }


    button->setChecked(true);
    m_curCheckBtn = button;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值