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;
}