539 字
3 分钟

QT的QCheckBox用法

2025-02-02
浏览量 加载中...

在 Qt 中,QCheckBox 的 stateChanged 信号使用方式如下:

基本用法#

// 连接 stateChanged 信号
connect(ui->checkBox, &QCheckBox::stateChanged, this, &MyClass::onCheckBoxStateChanged);
// 槽函数实现
void MyClass::onCheckBoxStateChanged(int state)
{
if (state == Qt::Checked) {
qDebug() << "Checkbox is checked";
} else if (state == Qt::Unchecked) {
qDebug() << "Checkbox is unchecked";
}
// 对于三态复选框,还可能有 Qt::PartiallyChecked
}

使用枚举提高可读性#

void MyClass::onCheckBoxStateChanged(int state)
{
switch (state) {
case Qt::Unchecked:
qDebug() << "未选中";
break;
case Qt::PartiallyChecked:
qDebug() << "部分选中";
break;
case Qt::Checked:
qDebug() << "选中";
break;
}
}

Lambda 表达式方式#

connect(ui->checkBox, &QCheckBox::stateChanged, [this](int state) {
if (state == Qt::Checked) {
// 选中时的处理
enableFeature();
} else {
// 未选中时的处理
disableFeature();
}
});

完整示例#

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent)
{
checkbox = new QCheckBox("启用功能", this);
checkbox->setTristate(true); // 启用三态
// 连接信号
connect(checkbox, &QCheckBox::stateChanged,
this, &MainWindow::onCheckboxStateChanged);
}
private slots:
void onCheckboxStateChanged(int state)
{
qDebug() << "状态改变:" << state;
switch (state) {
case Qt::Unchecked:
statusLabel->setText("功能已禁用");
break;
case Qt::PartiallyChecked:
statusLabel->setText("功能部分启用");
break;
case Qt::Checked:
statusLabel->setText("功能已启用");
break;
}
}
private:
QCheckBox *checkbox;
QLabel *statusLabel;
};

直接赋值改变值#

可以直接通过代码改变复选框的值,有多种方式:

1. 使用 setCheckState() - 推荐#

// 设置选中状态(会触发 stateChanged 信号)
ui->checkBox->setCheckState(Qt::Checked); // 选中
ui->checkBox->setCheckState(Qt::Unchecked); // 未选中
ui->checkBox->setCheckState(Qt::PartiallyChecked); // 部分选中(三态)

2. 使用 setChecked() - 仅用于二态#

// 设置选中/未选中(会触发 stateChanged 和 toggled 信号)
ui->checkBox->setChecked(true); // 选中
ui->checkBox->setChecked(false); // 未选中

3. 临时阻塞信号#

如果不想在设置值时触发信号:

// 临时阻塞信号,设置值后再恢复
ui->checkBox->blockSignals(true); // 阻塞信号
ui->checkBox->setCheckState(Qt::Checked);
ui->checkBox->blockSignals(false); // 恢复信号

完整示例#

// 情况1:完全不连接信号
QCheckBox *checkbox1 = new QCheckBox("选项1");
checkbox1->setCheckState(Qt::Checked); // 直接设置,无信号处理
// 情况2:连接信号但只用于特定操作
QCheckBox *checkbox2 = new QCheckBox("选项2");
connect(checkbox2, &QCheckBox::stateChanged, [](int state) {
// 只记录日志,不做复杂处理
qDebug() << "状态改变:" << state;
});
// 情况3:通过代码批量设置多个复选框
void setAllCheckboxes(bool checked)
{
// 临时阻塞所有信号
ui->checkBox1->blockSignals(true);
ui->checkBox2->blockSignals(true);
ui->checkBox3->blockSignals(true);
// 设置值
ui->checkBox1->setChecked(checked);
ui->checkBox2->setChecked(checked);
ui->checkBox3->setChecked(checked);
// 恢复信号
ui->checkBox1->blockSignals(false);
ui->checkBox2->blockSignals(false);
ui->checkBox3->blockSignals(false);
// 手动触发一次统一的处理
onCheckboxesChanged();
}

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
QT的QCheckBox用法
https://blog.vanilla.net.cn/posts/qt的qcheckbox用法/
作者
鹁鸪
发布于
2025-02-02
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-02-02,距今已过 372 天

部分内容可能已过时

评论区

目录