复选按钮QCheckBox
使用场景:多选多
文本
// 获取和设置显示的文本
QString text() const
void setText(const QString &text)
三态
复选按钮有三种状态
Qt::Checked
选中Qt::Unchecked
非选中Qt::PartiallyChecked
半选中,比如一组复选按钮中,只选择了部分时,可以设置为父项为半选状态
// 用于获取和设置是否支持三态
bool isTristate() const
void setTristate(bool y = true)
也可以禁能掉三态,禁能之后就只有选中和非选中两种状态了(默认是使能三态的)
是否选中
// 获取和设置复选按钮是否选中:checked/unchecked
bool isChecked() const
void setChecked(bool)
获取和设置状态
// 设置和获取复选按钮的状态
Qt::CheckState checkState() const
void setCheckState(Qt::CheckState state)
自动排他
复选按钮是多选多,因此自动排他是默认禁能的
// 获取和设置自动排他
bool autoExclusive() const
void setAutoExclusive(bool)
信号
// 单选按钮 QRadioButton 被点击时,会发出该信号
void clicked();
// 当复选按钮的选中状态发生改变时,会发射该信号
// 所谓状态改变,是指在 Checked/UnChecked/PartiallyChecked 之间状态改变
void stateChanged(int state)
举例:
多选多,全选时父项选中,未全选时父项半选,点击父项全选或全不选
值得注意的是:全选按钮点击后要禁能掉三态,因为点击后只能是选中或者非选中
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QCheckBox>
#include<QVBoxLayout>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr):QWidget(parent)
{
resize(400,300);
QVBoxLayout* v_box=new QVBoxLayout(this);
all_select=new QCheckBox(this);
all_select->setText("全选");
orange=new QCheckBox(this);
orange->setText("橘子");
apple=new QCheckBox(this);
apple->setText("苹果");
grape=new QCheckBox(this);
grape->setText("葡萄");
v_box->addWidget(all_select);
v_box->addWidget(orange);
v_box->addWidget(apple);
v_box->addWidget(grape);
//绑定信号槽,点击全选按钮时,全选或全不选
connect(all_select,&QCheckBox::clicked,this,[=](){
//全选按钮点击后要禁能掉三态,因为点击后只能是选中或者非选中
all_select->setTristate(false);
if(all_select->isChecked())
{
//全选按钮被选中时,其他复选框跟着选中
orange->setChecked(true);
apple->setChecked(true);
grape->setChecked(true);
}
else
{
//全不选
orange->setChecked(false);
apple->setChecked(false);
grape->setChecked(false);
}
});
//绑定信号槽
connect(orange,&QCheckBox::clicked,this,&Widget::onClicked);
connect(apple,&QCheckBox::clicked,this,&Widget::onClicked);
connect(grape,&QCheckBox::clicked,this,&Widget::onClicked);
}
~Widget()=default;
private:
void onClicked()
{
if(orange->isChecked()
&&apple->isChecked()
&&grape->isChecked())
{
//若全部选中了,则全选按钮也置为选中
all_select->setCheckState(Qt::Checked);
}
else if(!orange->isChecked()
&&!apple->isChecked()
&&!grape->isChecked())
{
//若都没选中,则全选按钮也置为不选中
all_select->setCheckState(Qt::Unchecked);
}
else
{
//其他情况则为半选
all_select->setCheckState(Qt::PartiallyChecked);
}
}
QCheckBox* all_select;
QCheckBox* orange;
QCheckBox* apple;
QCheckBox* grape;
};
#endif // WIDGET_H
学习链接:https://github.com/0voice