Qt每天一个小技巧之QObject ::blockSignals(信号阻塞)

   说好的计划,就要实现,今年我要把吹过的牛皮,设定的计划,统统给圆了。

   qt文档读写第一步,如下图,给了我们blockSignal  这个函数。字体意思就是信号阻塞。

Qt每天一个小技巧之QObject ::blockSignals(信号阻塞)_第1张图片

我们继续点看具体内容。

Qt每天一个小技巧之QObject ::blockSignals(信号阻塞)_第2张图片

 Qt描述:阻塞模式下,这个对象发送的信号都会被阻塞,解除阻塞后则不再阻塞。返回值为之前状态的阻塞情况。

看到这里,很多小伙伴可能跟我一样,这个函数有啥用呢,或者运用在什么方面呢,一般阻塞是为了防止出现死循环,或者等待别的完成后在执行。

我突然想到以前的一个问题:

     如下图,当我改变左边框的文字,右边的也会对应填写数据,当我在右边填写文字的时候,左边也跟着变化。

Qt每天一个小技巧之QObject ::blockSignals(信号阻塞)_第3张图片

 它的逻辑图如下:

Qt每天一个小技巧之QObject ::blockSignals(信号阻塞)_第4张图片

    这个时候我们可能就发现问题了,如果是信号的话,就会走1-2-3-4-5-2-3... 这样无限循环下去,我们想一下,要是能切断信号4,就可以左边写什么右边写什么,同理切断2的信号,就可以完成右边写什么,左边就写什么了。

    当然你直接使用textChanged  也会判断,至少会多发一个消息。如果只是接受到信号就发送的话,也就会出现死循环的问题,所以我们要用下面的方式来写:

void MainWindow::on_lineEditleft_textChanged(const QString &arg1)
{
   ui->lineEditright->blockSignals(true);
   ui->lineEditright->setText(arg1);
   ui->lineEditright->blockSignals(false);
}

void MainWindow::on_lineEditright_textChanged(const QString &arg1)
{
   ui->lineEditleft->blockSignals(true);
   ui->lineEditleft->setText(arg1);
   ui->lineEditleft->blockSignals(false);
}

效果图如下。 

Qt每天一个小技巧之QObject ::blockSignals(信号阻塞)_第5张图片

这里大家可以试试,发送信号的方式,看看是不是会出现是死循环,我真心告诉大家,不要只是去看,多下手写代码,你会学习到更多的东西,让我们共同进步吧。

 

你可能感兴趣的:(qt,提高部分,Qt,blocksignals,信号阻塞,qt小技巧)