QCheckBox类详解

QCheckBox类是Qt框架中的一个类,用于创建复选框(Checkbox)控件,允许用户在多个选项中选择一个或多个选项。它是QAbstractButton的子类,因此继承了按钮的特性。

  • 头:#include
  • qmake:QT+=widgets
  • 继承:QAbstractButton
  • 公共函数:
    QCheckBox(QWidget *parent = nullptr)
    QCheckBox(const QString &text,QWidget *parent = nullptr);
    ~QCheckBox();
    void setTristate(bool y = true);
    bool isTristate() const;
    Qt::CheckState checkState() const;
    void setCheckState(Qt::CheckState state);
  • 重实现公共函数
    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;
  • 信号
    void stateChanged(int);
  • 保护函数
    bool event(QEvent *e) override;
    bool hitButton(const QPoint &pos);
    void checkStateSet() override;
    void nextCheckState() override;
    void paintEvent(QPaintEvent *) override;
    void mouseMoveEvent(QMouseEvent *) override;
    void initStyleOption(QStyleOptionButton *option) const;
    下面是详细讲解:
    1、
QCheckBox(QWidget *parent = nullptr)

构造函数,采用给定parent,但是没有文本,parent被传递给QAbstractButton构造函数。
2、

QCheckBox(const QString &text,QWidget *parent = nullptr);

构造复选框采用给定parent和text,parent被传递给QAbstractButton构造函数。
3、

void setTristate(bool y = true);

设置QCheckBox控件的三态模式,三态模式包括选中、未选中和部分选中。setTristate函数中的参数y是一个bool类型,默认为true,用于指定是否开启三态模式。若y为fasle,则禁用三态模式,此时复选框只能处于选中或未选中的状态。
4、

bool isTristate() const;

查询复选框是否为三态模式。
5、

Qt::CheckState checkState() const;

查询复选框当前状态,该函数返回的是Qt::CheckState类型,Qt::CheckState是一个枚举类型,表示复选框的状态

enum CheckState {
Unchecked,            //未选中
PartiallyChecked,    //部分选中
Checked              //选中
};

6、

void setCheckState(Qt::CheckState state);

设置复选框状态
7、

QSize sizeHint() const override;

sizeHint()函数通常用于自定义部件的布局,这个函数返回一个QSize对象,表示部件的推荐大小。const override关键字表明这是一个常量成员函数,并且重写了基类中的虚函数。
8、

QSize minimumSizeHint() const override;

minimunSizeHint()函数与sizeHint()函数相似,它也是用于指定部件的推荐最小大小的,以确保在布局过程中不会将部件调整得太小而无法显示其内容。const override关键字表明这是一个常量成员函数,并且重写了基类中的虚函数。
9、
信号

void stateChanged(int state);

stateChanged(int)是一个信号,它在状态发生改变时发出,具体来说,这个信号会在复选框(或其他类似的部件)的状态发生变化时被触发,它的参数表示复选框的新状态。
参数state表示复选框的新状态,以下是state的三种状态和对应的整数值:
0:Unchecked,未选中
1:PartiallyChecked,部分选中
2:Checked,选中
在使用这个信号时,你可以连接它到一个槽函数,以便在复选框的状态在发生变化时执行特定的操作。
10、

bool event(QEvent *e) override;

event(QEvent *e)是Qt中用于处理事件的虚函数,常常在自定义部件中被重写。它接收一个QEvent指针作为参数,表示一个事件对象。该函数负责处理各种类型的事件,并根据需要进行相应的操作。常用的事件就是鼠标按下和键盘按下事件。例如:

bool event(QEvent *e) override{
    switch(e->type())
    {
        case QEVent::MouseButtonPress:
        //处理鼠标按下事件
        break;
        case QEvent::KeyPress:
        //处理键盘按下事件
        break;
        //其他事件类型的处理
        default:
        //其他事件类型,交给父类处理
            return QWidegt::event(e);
    }
    return true;
}

11、

bool hitButton(const QPoint &pos);

hitButton(const QPoint &pos)是QAbstractButton类中的一个成员函数,在QCheckBox类 中也是可用的,因为QCheckBox是QAbstractButton的子类。
这个函数用于判断给定的点“pos”是否在按钮部件上,如果给定的点在按钮上,则返回true,否则返回false。参数pos是一个QPoint对象,表示待检查的点的坐标位置,这个坐标是相对于按钮部件的局部坐标系的。
12、

void checkStateSet() override;

checkStateSet()是QCheckBox类中的一个虚函数,用于处理复选框的状态被设置时的事件。当用户点击复选框以改变其状态时,会触发checkStateSet()函数,你可以在子类中重写这个函数,以便在状态被设置时执行待定的操作。
13、

void nextCheckState() override;

nextCheckState()是QCheckBox类中的一个虚函数,用于在用户点击复选框时切换其状态。当用户点击复选框时,会自动调用nextCheckState()函数切换复选框的状态,在这个函数会在选中、取消选中和部分选中之间进行循环切换。你可以在子类中重写这个函数,以便在状态切换时执行待定的操作。

checkStateSet()与nextCheckState()的区别:
checkStateSet():
功能:用于处理复选框的状态被设置时的事件,它在复选框的状态被修改时(无论是通过用户操作还是通过编程方式),都会被调用。
调用时机:当复选框的状态被设置时(例如用户点击复选框,或者通过编程方式调用setChecked()函数设置状态),都会触发checkStateSet()函数。
nextCheckState():
功能:用于切换复选框的状态,每当用户点击复选框时,会自动调用nextCheckState()函数,从而在选中、取消选中和部分选中之间进行循环切换。
调用时机:用户点击复选框时会触发nextCheckState()函数。
14、

void paintEvent(QPaintEvent *) override;

在QCheckBox或其他部件中,重写painEvent()函数可以用来自定义部件的绘制行为,以实现待定的外观效果。你可以在这个函数中使用QPainter对象执行绘制操作,绘制任何你想要的内容,比如文本、图像、形状等。
该函数会在部件需要重新绘制时被自动调用,以便更新部件的外观。以下是一些触发paintEvent()被调用的常见情况:
(1)部件首次显示:当一个部件第一次显示时、或者在调用"show()"函数后,部件会被首次绘制,此时paintEvent()函数会被调用。
(2)部件被部分或完全遮挡,然后再次显示:例如,通过移动窗口、切换其他窗口,部件可能需要重新绘制,此时paintEvent()函数会被调用。
(3)部件的内容发生变化:例如,文本标签的文本内容改变了,复选框的状态改变了等,部件可能需要重新绘制以反映这些变化,此时paintEvent()函数会被调用。
(4)显示调用update()函数:如果在代码中调用了部件的update()函数,那么部件会被要求重新绘制,此时paintEvent()函数会被调用。
15、

void mouseMoveEvent(QMouseEvent *) override;

mouseMoveEvent(QMouseEvent *)用于处理鼠标移动事件,当鼠标在部件内移动时,mousMoveEvent(QMouseEvent *)函数会被调用,你可以在重写的函数中获取鼠标的位置信息,以及执行任何你想要的逻辑,比如根据鼠标的位置更新部件的状态,显示鼠标提示等。
16、

void initStyleOption(QStyleOptionButton *option) const;

initStyleOption(QStyleOptionButton *option)const是QAbstractButton类中的虚函数,是一个用于描述按钮样式的类,它包含了按钮的各种属性,比如状态,尺寸,文本等。通常在QAbstractButton的子类中被重写。它用于初始化一个QStyleOptionBbutton对象,以便在绘制按钮时使用特定的样式选项。
QStyleOptionButton是一个用于描述按钮样式的类,它包含了按钮的各种属性,比如状态、尺寸、文本等,通过初始化QSttyleOptionButton对象,可以为按钮的绘制提供必要的信息,以便使用当前的样式。
补充:
若你的自定义部件继承自QCheckBox,但是在点击后状态没有改变,可能有几个原因需要检查:
1、事件处理函数是否正确实现:首先确保你正确重写了鼠标点击事件处理函数,比如mousePressEvent(),在这个函数中,你应该调用QCheckBox的toggle()函数来切换复选框的状态。

void CustomCheckBox::mousePressEvent(QMouseEvent *event)
{
 if(event ->button() == Qt::LeftButton)
{
toggle();//切换复选框状态
}
}

2、事件过滤器是否设置:检查是否有其他地方设置了事件过滤器,并阻止了鼠标点击事件的传递。
3、父类的实现是否被覆盖:确保你的自定义部件没有覆盖了父类的实现,例如 paintEvent()、mousePressEvent() 等函数。
4、样式表是否覆盖了默认样式:如果你在样式表中修改了复选框的外观,可能会导致点击后状态没有改变。确保你的样式表设置正确,不会影响到状态切换。
以下给出一个简单的示例:
CustomCheckBox自定义部件类
CustomCheckBox.h

#ifndef CUSTOMCHECKBOX_H
#define CUSTOMCHECKBOX_H

#include <QObject>
#include <QWidget>
#include <QAbstractButton>
#include <QStyleOptionButton>
#include <QCheckBox>
#include <QEvent>
#include <QMouseEvent>
#include <QPainter>
#include <QDebug>
class CustomCheckBox : public QCheckBox
{
    Q_OBJECT
public:
    explicit CustomCheckBox(QWidget *parent = nullptr);
protected:
    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;

    bool event(QEvent *e) override;
    void mousePressEvent(QMouseEvent *event) override;
    void checkStateSet() override;
    void nextCheckState() override;
    void paintEvent(QPaintEvent *) override;
    void mouseMoveEvent(QMouseEvent *) override;

signals:

public slots:
};

#endif // CUSTOMCHECKBOX_H

CustomCheckBox.cpp

#include "customcheckbox.h"

CustomCheckBox::CustomCheckBox(QWidget *parent) : QCheckBox(parent)
{

}

QSize CustomCheckBox::sizeHint() const
{
    return QSize(50,50);//返回推荐大小为50x50大小
}

QSize CustomCheckBox::minimumSizeHint() const
{
    return QSize(50,50);
}

bool CustomCheckBox::event(QEvent *e)
{
    if(e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *m_event = static_cast<QMouseEvent *>(e);
        if(m_event->button() == Qt::LeftButton)
        {
            toggle();//切换复选框状态
            qDebug()<<"Left button pressed";
        }

        return true;
    }
    return QCheckBox::event(e);//对于其他事件类型,交给父类处理
}

void CustomCheckBox::mousePressEvent(QMouseEvent *event)
{

    //获取鼠标点击的位置
    QPoint pos = event->pos();
    //判断点击位置是否在按钮上
    if(hitButton(pos))
    {
        qDebug()<<"Mouse pressed on the button";
    }else {
        qDebug()<<"Mouse pressed outside the button";
    }
}

void CustomCheckBox::checkStateSet()
{
    //调用基类的实现
    QCheckBox::checkStateSet();
    //打印复选框的当前状态
    qDebug()<<"CheckBox state set to :"<<(isChecked() ? "Checked" : "UnChecked");
}

void CustomCheckBox::nextCheckState()
{
    //调用基类的实现
    QCheckBox::nextCheckState();
    //打印新的复选框状态
    qDebug()<<"CheckBox state changed to:"<<(isChecked() ? "Checked" : "UnChecked");
}

void CustomCheckBox::paintEvent(QPaintEvent *)
{
    //调用基类的实现
    QCheckBox::paintEvent(nullptr);
    //自定义绘制行为
    QPainter painter(this);
    painter.drawText(rect(),Qt::AlignCenter,"Custom Text");
    painter.drawRect(rect().adjusted(2,2,-2,-2));

//    QStyleOptionButton option;
//    initStyleOption(&option);
//    //使用样式选项绘制按钮
//    QPainter painter2(this);
//    style()->drawControl(QStyle::CE_PushButton,&option,&painter2,this);
}

void CustomCheckBox::mouseMoveEvent(QMouseEvent *event)
{
    //获取鼠标位置
    QPoint pos = event->pos();
    //打印鼠标位置信息
    qDebug()<<"Mouse move event at:"<<pos;
    //在这里可以执行任何你想要的逻辑,比如根据鼠标位置更新部件状态
}

MainWindows.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVBoxLayout>
#include <QCheckBox>
#include <customcheckbox.h>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public slots:
    void SlotStateChanged(int state);
private:
    Ui::MainWindow *ui;
    QCheckBox *m_checkbox;
    CustomCheckBox *m_customcheckbox;
};

#endif // MAINWINDOW_H

MainWindows.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //m_chekbox = QCheckBox();
    m_checkbox =new QCheckBox(QStringLiteral("复选框"));
    m_checkbox->setTristate(true);//开启三态模式
    m_checkbox->setCheckState(Qt::Unchecked);//设置未选中
    m_customcheckbox = new CustomCheckBox();

    QVBoxLayout *layout = new QVBoxLayout(centralWidget());
    layout ->addWidget(m_checkbox);
    layout ->addWidget(m_customcheckbox);

    connect(m_checkbox,&QCheckBox::stateChanged,this,&MainWindow::SlotStateChanged);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::SlotStateChanged(int state)
{
    qDebug()<<"CheckState:"<<state;
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值