QSignalBlocker在构造函数中阻塞信号,在析构函数中它将状态重置为构造函数运行前的状态。
QSignalBlocker用来代替blockSignals()。当使用blockSignals()来阻塞信号时,总要成对使用blockSignals(true)和blockSignals(false)。一不小心少写一个则信号一直阻塞后果难料,使用QSignalBlocker代替则不会有问题。
测试代码:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QDateTime>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(&timer,&QTimer::timeout,this,&Widget::onTimer);
timer.start(1000);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QSignalBlocker blocker(timer);
QEventLoop eventloop;
QTimer::singleShot(5000, &eventloop, SLOT(quit()));
eventloop.exec();
qDebug()<<"过了5秒";
}
void Widget::onTimer()
{
qDebug()<<"xxxxxxx"<<QDateTime::currentDateTime();
}
定时器每秒打印一次时间,按下按钮阻塞定时器5秒看效果: