复选按钮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_OBJECTpublic: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