阻止Qt控件发出信号的方法
2026/6/9 1:00:07 网站建设 项目流程

大多数Qt控件,如QCheckBox,QComboBox等,在被(取消)勾选、切换选项时都会发出诸如stateChanged、currentIndexChanged这类的信号。但是有时,我们需要控件只在某些情况下发出信号,其他时候则不发出信号。看下面的例子:

#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QPushButton> #include <QCheckBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //checkbox发生变化,触发label变化 connect(ui->checkBox, &QCheckBox::stateChanged, [this](int iState){ ui->label->setText(QString("%1").arg(iState)); }); //启用blockSignals后,按钮按下后,触发checkbox变化。但是不再触发checkbox的statChanged信号,也就不再引起label变化; //假如不启用blockSignals,每次按下按钮,都会触发checkbox的statChanged信号 connect(ui->pushButton, &QPushButton::clicked, [this](){ //ui->checkBox->blockSignals(true); ui->checkBox->toggle(); //ui->checkBox->blockSignals(false); }); } MainWindow::~MainWindow() { delete ui; }

效果:

阻止Qt控件发出信号的方法-不使用blockSignals

这里,每次按下按钮,都会触发checkbox的stateChanged信号,于是label的显示也随之变化。

假如我只想要操作checkbox时才触发stateChanged信号,其他时候不触发,就要使用blockSignals函数:

#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <QPushButton> #include <QCheckBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //checkbox发生变化,触发label变化 connect(ui->checkBox, &QCheckBox::stateChanged, [this](int iState){ ui->label->setText(QString("%1").arg(iState)); }); //启用blockSignals后,按钮按下后,触发checkbox变化。但是不再触发checkbox的statChanged信号,也就不再引起label变化; //假如不启用blockSignals,每次按下按钮,都会触发checkbox的statChanged信号 connect(ui->pushButton, &QPushButton::clicked, [this](){ ui->checkBox->blockSignals(true); ui->checkBox->toggle(); ui->checkBox->blockSignals(false); }); } MainWindow::~MainWindow() { delete ui; }

效果:

阻止Qt控件发出信号的方法-使用blockSignals

结论

使用blockSignals(true)可以临时阻止控件发送信号;但是blockSignals(false)可以解除此限制。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询