大多数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)可以解除此限制。
阻止Qt控件发出信号的方法
大多数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)可以解除此限制。