介绍
QCheckBox在QT中被用作复选按钮,与单选按钮不同的是,单选按钮被用作“多选一”场景,复选按钮被用作“多选多”场景。
案例如下所示:
使用方法
文本
和前几篇一样,可以获取文本和设置文本,使用方法我就不过多介绍了
// 获取和设置显示的文本
QString text() const
void setText(const QString &text)
三态
复选按钮不同于单选按钮只有两种状态,复选按钮有三种状态:
- Qt::Checked 选中 ——表示选项未选中,复选框未空心,使用其isChecked()函数的时候,返回false
- Qt::Unchecked 非选中 ——表示选项选中,复选框未实心,使用其isChecked()函数的时候,返回true
相关函数如下:
// 获取和设置复选按钮是否选中:checked/unchecked
bool isChecked() const
void setChecked(bool)
- Qt::PartiallyChecked 半选中——这个状态是属于QCheckBox特有的状态,在某些场景非常有用,它表示选项状态不确定,既不是完全选中,又不是完全未选中,不过在软件页面还是非常常见的,如下图:
可以通过代码和属性栏来设置复选按钮是否支持三态:
// 用于获取和设置是否支持三态
bool isTristate() const
void setTristate(bool y = true)
除此之外,还可以通过代码获取当前复选按钮的状态,即选中、未选中、半选中。
// 设置和获取复选按钮的状态
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)
UI界面
按钮我添加了图标,更加美观。添加方法网上有很多,大家可以自行寻找
案例
代码:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//五个复选按钮对应一个槽函数
connect(ui->checkBox_apple,&QCheckBox::stateChanged,this,&Widget::onStateChanged);
connect(ui->checkBox_pear,&QCheckBox::stateChanged,this,&Widget::onStateChanged);
connect(ui->checkBox_peach,&QCheckBox::stateChanged,this,&Widget::onStateChanged);
connect(ui->checkBox_orange,&QCheckBox::stateChanged,this,&Widget::onStateChanged);
connect(ui->checkBox_banana,&QCheckBox::stateChanged,this,&Widget::onStateChanged);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_checkBox_All_clicked()
{
ui->checkBox_All->setTristate(false);//全选按钮的三态设置成false
Qt::CheckState state = ui->checkBox_All->checkState();//检测当前状态并赋值给state,便于后期程序编写
if(state == Qt::Checked)
{
ui->checkBox_apple->setChecked(true);//设置复选按钮状态为选中
ui->checkBox_pear->setChecked(true);
ui->checkBox_peach->setChecked(true);
ui->checkBox_orange->setChecked(true);
ui->checkBox_banana->setChecked(true);
}
else if(state == Qt::Unchecked)
{
ui->checkBox_apple->setChecked(false);//设置复选按钮状态为未选中
ui->checkBox_pear->setChecked(false);
ui->checkBox_peach->setChecked(false);
ui->checkBox_orange->setChecked(false);
ui->checkBox_banana->setChecked(false);
}
}
void Widget::onStateChanged()
{
QString s;
int apple = ui->checkBox_apple->isChecked();//检测当前按钮状态
int pear = ui->checkBox_pear->isChecked();
int peach = ui->checkBox_peach->isChecked();
int orange = ui->checkBox_orange->isChecked();
int banana = ui->checkBox_banana->isChecked();
if(apple && pear && peach && orange && banana)//全部选中则设置全选按钮为选中,
{
ui->checkBox_All->setCheckState(Qt ::Checked);
}
else if(apple || pear || peach || orange ||banana)
{
ui->checkBox_All->setCheckState(Qt::Unchecked);
}
else
{
ui->checkBox_All->setCheckState(Qt::PartiallyChecked);
}
if(apple)
{
s += ui->checkBox_apple->text() +=" ";
}
if(pear)
{
s += ui->checkBox_pear->text() +=" ";
}
if(peach)
{
s += ui->checkBox_peach->text() +=" ";
}
if(orange)
{
s += ui->checkBox_orange->text() +=" ";
}
if(banana)
{
s += ui->checkBox_banana->text() +=" ";
}
ui->lineEdit->setText(s);//字符s显示在文本框
}