信号槽的连接与断开

[复制链接]
1050|3
 楼主| gaoyang9992006 发表于 2019-7-18 21:58 | 显示全部楼层 |阅读模式
信号槽就好比单片机里面的中断,某个中断发生后,触发中断函数。
刚好,信号槽的连接和断开就好比单片机的中断使能和失能一样。接下来用给实际例子说明该种用法。

我们想通过文本框的内容变化事件触发一个函数,用来处理文本框内的字符串。然而,当我们处理字符串由回写后,肯定会导致文本框内的内容变化,再次触发事件。这是我们不像看到的,能否像中断函数一样,进入后,我们先关闭中断,完成后,清理中断标志,恢复中断功能呢?

信号槽的连接通过:
connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));
实际上connect函数应该是如下形式:
connect(sender,SIGNAL(signal),receiver,SLOT(slot),Qt::DirectConnection);


信号槽的断开通过:
[static] bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

disconnect(myObject, 0, 0, 0);
myObject->disconnect();
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
myObject->disconnect(SIGNAL(mySignal()));
disconnect(myObject, 0, myReceiver, 0);

myObject->disconnect(myReceiver);
----------------------------------------------------------------------------
以上是几种常用形式,现在看我们这里怎么用。
我们通过UI建立信号槽后,系统默认会给我们配置和信号槽连接,在程序里不可见。
我们在信号事件触发的函数里通过下面的指令,断开信号连接。
   ui->textEdit->disconnect();执行其他的任务后,恢复连接
    connect(ui->textEdit,SIGNAL(textChanged()),this,SLOT(on_textEdit_textChanged()));
 楼主| gaoyang9992006 发表于 2019-7-18 22:00 | 显示全部楼层
  1. void MainWindow::on_textEdit_textChanged()
  2. {

  3.    ui->textEdit->disconnect();

  4.    qDebug()<<"Enter timeout processing function\n";
  5.    QString str =ui->textEdit->toPlainText();
  6.    str.remove(QRegExp("\\s"));//移除空格
  7. if(str.length()%2==0)
  8. {
  9.    QByteArray text;


  10.     text=QByteArray::fromHex(str.toLatin1()); //获取文本框的字符串,转换成字流
  11.     qDebug()<<text.data();            // returns 字符串
  12.     str=text.toHex(' ');
  13.     ui->textEdit->setText(str);
  14.     qDebug()<<"text:"<<str;            // 每两个字中间插入1个空格
  15.     qDebug()<<"--------------------------------";
  16.     ui->textEdit->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
  17. }

  18.     connect(ui->textEdit,SIGNAL(textChanged()),this,SLOT(on_textEdit_textChanged()));
  19. }
上面是完整的代码
 楼主| gaoyang9992006 发表于 2019-7-18 22:00 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2019-7-18 22:07 编辑

如果不采用该种方式,那么自动修改内容后,会触发再次进入,造成死循环。卡死。崩溃。
892302218 发表于 2020-2-22 19:12 | 显示全部楼层
connect(ui->textEdit,SIGNAL(textChanged()),this,SLOT(on_textEdit_textChanged()));
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部