Qt 之 QCheckBox

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

QCheckBox继承自QAbstractButton,它提供了一个带文本标签的复选框。

QCheckBox(复选框)和QRadioButton(单选框)都是选项按钮。这是因为它们都可以在开(选中)或者关(未选中)之间切换。区别是对用户选择的限制:单选框定义了“多选一”的选择,而复选框提供的是“多选多”的选择。

尽管在技术上可以通过复选框来实现单选框的行为,反之亦然,但还是强烈建议使用众所周知的约定。

详细描述

QButtonGroup可以用来在视觉上把许多复选框组织在一起。

只要复选框被选中或者清除,都会发射一个stateChanged()信号。如果想在复选框状态改变的时候触发一个行为,请连接这个信号,可以使用 isChecked()来查询复选框是否被选中。

除了常用的选中和未选中两个状态,QCheckBox还可选地提供了第三种状态(半选)来表明“没有变化”。当需要给用户一个选中或者未选中复选框的选择时,这是很有用的。如果需要第三种状态,可以通过setTristate()来使它生效,并使用checkState()来查询当前的切换状态。

和QPushButton一样,复选框可以显示文本或者图标。文本可以通过构造函数或者setText()来设置,图标可以通过setIcon()来设置。

QCheckBox *checkbox = new QCheckBox("C&ase sensitive", this);

这个例子中,快捷键为Alt+a,详情请参阅QShortcut文档。要显示一个实际的符号,使用“&&”。

重要的继承函数:text()、setText()、pixmap()、setPixmap()、accel()、setAccel()、isToggleButton()、setDown()、isDown()、isOn()、checkState()、 autoRepeat()、isExclusiveToggle()、group()、setAutoRepeat()、toggle()、pressed()、released()、clicked()、toggled()、checkState()、stateChanged()。

共有函数

  • Qt::CheckState checkState() const
    返回复选框的选中状态。如果不需要三态的支持,可以使用QAbstractButton::isChecked(),它返回一个布尔值。

  • bool isTristate() const
    复选框是否为一个三态复选框。

默认的是false,也就是说复选框只有两个状态。

  • void setCheckState(Qt::CheckState state)
    设置复选框的选中状态。如果不需要三态的支持,可以使用QAbstractButton:setChecked(),它接受一个布尔值。

  • void setTristate(bool y = true)
    设置复选框为一个三态复选框。

信号

  • void stateChanged(int state)
    当复选框状态发生改变,这个信号就会被发射。即:用户选中或者取消选中。

示例

三态复选框

下面,我们实现一个三态复选框,并监听状态变化。

效果

这里写图片描述

源码

构造一个复选框QCheckBox,然后使用setTristate()开启三态模式。

QCheckBox *pCheckBox = new QCheckBox(this);
m_pLabel = new QLabel(this);

m_pLabel->setText("Click CheckBox...");
pCheckBox->setText(QString::fromLocal8Bit("三态复选框"));

// 开启三态模式
pCheckBox->setTristate();  

// 连接信号槽
connect(pCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onStateChanged(int)));

槽函数,判断当前复选框状态,其中包括:选中(Qt::Checked)、半选(Qt::PartiallyChecked)、未选中(Qt::Unchecked)。

void MainWindow::onStateChanged(int state)
{
    if (state == Qt::Checked) // "选中"
    {
        m_pLabel->setText("Checked");
    }
    else if(state == Qt::PartiallyChecked) // "半选"
    {
        m_pLabel->setText("PartiallyChecked");
    }
    else // 未选中 - Qt::Unchecked
    {
        m_pLabel->setText("Unchecked");
    }
}

QSS

复选框样式。

QCheckBox{
        spacing: 5px;
        color: white;
}
QCheckBox::indicator {
        width: 17px;
        height: 17px;
}
QCheckBox::indicator:enabled:unchecked {
        image: url(:/Images/checkBox);
}
QCheckBox::indicator:enabled:unchecked:hover {
        image: url(:/Images/checkBoxHover);
}
QCheckBox::indicator:enabled:unchecked:pressed {
        image: url(:/Images/checkBoxPressed);
}
QCheckBox::indicator:enabled:checked {
        image: url(:/Images/checkBoxChecked);
}
QCheckBox::indicator:enabled:checked:hover {
        image: url(:/Images/checkBoxCheckedHover);
}
QCheckBox::indicator:enabled:checked:pressed {
        image: url(:/Images/checkBoxCheckedPressed);
}
QCheckBox::indicator:enabled:indeterminate {
        image: url(:/Images/checkBoxIndeterminate);
}
QCheckBox::indicator:enabled:indeterminate:hover {
        image: url(:/Images/checkBoxIndeterminateHover);
}
QCheckBox::indicator:enabled:indeterminate:pressed {
        image: url(:/Images/checkBoxIndeterminatePressed);
}

连接stateChanged()信号和槽函数,当用户点击复选框时,状态发生改变就会调用槽函数。

那么,如果我们不是手动在界面上点击,如何执行槽函数呢?

这时,有些人就会说这很简单啊,看connect就清楚了,直接发射stateChanged()信号或直接调用槽函数:

emit pCheckBox->stateChanged(Qt::PartiallyChecked);
onStateChanged(Qt::PartiallyChecked);

这当然可以。这里我想说的是除了这种方式外,还有木有其它方式呢?我们追朔到QCheckBox的基类QAbstractButton,它里面有一系列的信号和函数,我们可以尝试一下。

经过试验,我们归结了两类,分别是可触发和不可触发槽函数的:

  • 不可触发槽函数:
emit pCheckBox->clicked(true);
emit pCheckBox->toggled(true);
emit pCheckBox->pressed();
emit pCheckBox->released();
  • 可触发槽函数:
pCheckBox->animateClick();
pCheckBox->click();
pCheckBox->toggle();
pCheckBox->setChecked(true);
pCheckBox->setCheckState(Qt::PartiallyChecked); // QCheckBox自身接口

也就是说,通过调用这些信号或函数,我们可以很容易判定其是否可以触发stateChanged()信号,从而调用槽函数onStateChanged()。

开关效果

我们来实现一个iphone中常见的开关效果 - 多选。

效果

这里写图片描述

源码

构建复选框QCheckBox,然后将它们添加至按钮组QButtonGroup中。

QHBoxLayout *pLayout = new QHBoxLayout();
m_pButtonGroup = new QButtonGroup(this);

// 设置不互斥
m_pButtonGroup->setExclusive(false);
for (int i = 0; i < 3; ++i)
{
    QCheckBox *pCheckBox = new QCheckBox(this);

    // 设置文本
    pCheckBox->setText(QString::fromLocal8Bit("切换%1").arg(i + 1));

    pLayout->addWidget(pCheckBox);
    m_pButtonGroup->addButton(pCheckBox);
}
pLayout->setSpacing(10);
pLayout->setContentsMargins(10, 10, 10, 10);

setLayout(pLayout);

// 连接信号槽
connect(m_pButtonGroup, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(onButtonClicked(QAbstractButton*)));

槽函数,用来判断当前点击的按钮,以及获取按钮组各个按钮的选中状态。

void MainWindow::onButtonClicked(QAbstractButton *button)
{
    // 当前点击的按钮
    qDebug() << QString("Clicked Button : %1").arg(button->text());

    // 遍历按钮,获取选中状态
    QList<QAbstractButton*> list = m_pButtonGroup->buttons();
    foreach (QAbstractButton *pCheckBox, list)
    {
        QString strStatus = pCheckBox->isChecked() ? "Checked" : "Unchecked";
        qDebug() << QString("Button : %1 is %2").arg(pCheckBox->text()).arg(strStatus);
    }
}

###QSS

复选框样式

QCheckBox{
    spacing: 2px;
    color: white;
}
QCheckBox::indicator {
    width: 45px;
    height: 30px;
}
QCheckBox::indicator:unchecked {
    image: url(:/Images/switchOff);
}
QCheckBox::indicator:unchecked:hover {
    image: url(:/Images/switchOffHover);
}
QCheckBox::indicator:unchecked:pressed {
    image: url(:/Images/switchOffPressed);
}
QCheckBox::indicator:checked {
    image: url(:/Images/switchOn);
}
QCheckBox::indicator:checked:hover {
    image: url(:/Images/switchOnHover);
}
QCheckBox::indicator:checked:pressed {
    image: url(:/Images/switchOnPressed);
}

上面,我们通过调用QButtonGroup的setExclusive(false)来设置按钮组中的复选框不互斥(可以多选)。

如上,我们使用了QButtonGroup,仅仅为了演示复选框实现单选功能(只需设置setExclusive(true)打开互斥即可)。即使这样,如之前所言 - 强烈建议使用众所周知的约定。所以,如果要实现单选功能,建议选择QRadioButton。

更多参考

### 回答1: QTableView 是一个显示表格数据的控件,它提供了一种在界面上展示数据的方式,可以方便地查看和编辑表格数据。 QCheckBox 是一个单选框控件,它提供了一种选择或取消选择某个选项的方式。当需要用户在多个选项中进行单选操作时,可以使用 QCheckBox 控件来增加用户的交互体验。 在使用 QTableView 和 QCheckBox 控件时,可以将 QCheckBox 添加到 QTableView 的某一列中的每一个单元格中,用来标识该行数据是否被选中。这样就可以实现在表格中选择或取消选择某些特定的行数据。 当用户点击某个 QCheckBox 控件时,可以通过信号和槽机制来捕捉到 QCheckBox 被选中或取消选中的事件,然后根据事件来改变 QTableView 中相应行数据的状态。 除此之外,还可以通过通过编程的方式操作 QCheckBox 控件,例如通过代码设置某一行的 QCheckBox 控件为选中状态或取消选中状态,或者获取某一行 QCheckBox 控件的状态来进行相关的处理。 总之,使用 QTableView 和 QCheckBox 控件可以方便地对表格数据进行展示和选择操作,提供了一种方便和快捷的方式来处理表格数据。 ### 回答2: QTableView是一个表格视图,它是Qt中数据展示的一种常用方式。它可以显示一张表格,其中包含了行和列的数据。 QCheckbox是一个复选框,它是Qt中常用的一种控件。它可以同时显示未选中和选中两种状态,并且可以通过用户的操作来切换状态。 当我们将这两个控件结合使用时,可以实现一些有趣的功能。 例如,我们可以在QTableView中的某一列中插入QCheckbox,这样每一行都会有一个复选框。用户可以通过勾选或取消勾选这些复选框来选择其中的某些行。 此外,我们还可以编写代码来实现全选或全不选的功能。比如,当用户点击一个全选的复选框时,所有的行的复选框都会变为选中状态,当用户取消勾选全选的复选框时,所有的行的复选框都会变为未选中状态。 我们还可以在QTableView中使用QCheckbox来控制一些与数据相关的操作。比如,当用户勾选某个复选框时,可以执行某个特定的操作,比如删除该行的数据。 综上所述,QTableView和QCheckbox是两个常用的Qt控件,结合使用可以实现很多有用的功能。在开发Qt应用程序时,我们可以根据具体需求来使用它们,提供更好的用户体验。 ### 回答3: QTableView和QCheckBoxQt框架中常用的两个控件。 QTableView是一个表格视图控件,用于显示二维数据。通过QTableView,可以将数据以表格的形式展示出来,并支持对数据进行排序、筛选、编辑等操作。QTableView可以根据需要自定义表头、行数、列数、单元格内容和格式等。同时,还可以通过设置不同的选择模式,实现单选、多选或无选择的功能。 QCheckBox则是一个复选框控件,用于表示二选一或多选一的状态。通过QCheckBox,用户可以在多个选项中进行选择,并可以通过勾选或取消勾选的方式改变其状态。QCheckBox可以设置默认状态、选中状态、禁用状态等,并且可以通过信号和槽机制,实现对状态变化的响应。 在使用QTableView时,可以将QCheckBox作为一个自定义的编辑控件嵌入到表格中的某一列,用于表示某个特定的列为复选框的选择状态。例如,在一个任务列表中,可以将某一列设为复选框,用于选择是否完成相应的任务。这样,用户可以通过对复选框进行勾选或取消勾选的操作来改变任务的完成状态。 总而言之,QTableView和QCheckBoxQt框架中十分有用的两个控件。通过QTableView,可以轻松地展示和处理二维数据,而QCheckBox则为用户提供了一种方便的选择和控制状态的方式。它们的结合使用,可以帮助我们开发出更加灵活和交互性的应用程序。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一去丶二三里

有收获,再打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值