打印

信号槽的连接与断开

[复制链接]
810|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 | 只看该作者
void MainWindow::on_textEdit_textChanged()
{

   ui->textEdit->disconnect();

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


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

    connect(ui->textEdit,SIGNAL(textChanged()),this,SLOT(on_textEdit_textChanged()));
}
上面是完整的代码

使用特权

评论回复
板凳
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()));

使用特权

评论回复
发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1951

主题

15890

帖子

207

粉丝