• 9170阅读
  • 6回复

[提问]关于槽的重新连接 [复制链接]

上一主题 下一主题
离线reynoldxu
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-04
我在udp接受数据时绑定了槽函数处理数据
  1. qDebug()<<"Bind绑定端口结果"<<udpSocket.bind(4197,QUdpSocket::ShareAddress/*QUdpSocket::ReuseAddressHint*/);
  2. qDebug()<<"connect连接槽函数"<<connect(&udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

处理完数据后解除连接
  1. qDebug()<<"解除连接结果"<<disconnect(&udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

当我需要再次接受数据时,重新连接槽函数
  1. qDebug()<<"connect连接槽函数"<<connect(&udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

运行时都显示结果为true,但实际上当再次连接时,槽函数不处理数据,什么反应也没有,请教原因
[ 此帖被reynoldxu在2011-04-04 16:10重新编辑 ]
离线wxj120bw

只看该作者 1楼 发表于: 2011-04-04
引用楼主reynoldxu于2011-04-04 16:10发表的 关于槽的重新连接 :
我在udp接受数据时绑定了槽函数处理数据
  1. qDebug()<<"Bind绑定端口结果"<<udpSocket.bind(4197,QUdpSocket::ShareAddress/*QUdpSocket::ReuseAddressHint*/);
  2. qDebug()<<"connect连接槽函数"<<connect(&udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

处理完数据后解除连接
  1. qDebug()<<"解除连接结果"<<disconnect(&udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));

.......

多贴些代码吧
离线reynoldxu

只看该作者 2楼 发表于: 2011-04-05
回 1楼(wxj120bw) 的帖子
有两个按钮:   打开  和 关闭

运行程序,第一次可以正常运行(单击一次打开,单击一次关闭)  --->但是<--第二次单击开始就不对了,processPendingDatagrams()没有执行(但是槽函数连接显示正常,都是从qDebug输出里判断的)
//.h文件
  1. volatile bool isnetopen;//网口是否打开
  2. volatile bool isbinded;//是否绑定
  3. private slots:
  4.     void on_CloseCom_clicked();
  5.     void on_OpenCom_clicked();
  6.     void processPendingDatagrams();//读网口

//打开按钮函数
  1. void Widget::on_OpenCom_clicked()
  2. {
  3.     ui->ShowStatus->setText("Start Working");
  4.     qDebug()<<"Net Port";
  5.         if(false==isbinded){
  6.             qDebug()<<"Bind绑定端口结果"<<udpSocket.bind(4197,QUdpSocket::ShareAddress);
  7.             qDebug()<<"Binded ok!!!!!!";
  8.             isbinded=true;
  9.         }
  10.         qDebug()<<"connect连接槽函数"<<connect(&udpSocket, SIGNAL(readyRead()),
  11.                 this, SLOT(processPendingDatagrams()));
  12.         isnetopen=true;
  13. }


//关闭按钮函数
  1. if(isnetopen==true){
  2.         qDebug()<<"解除连接结果"<<disconnect(&udpSocket, SIGNAL(readyRead()),this, SLOT(processPendingDatagrams()));
  3.         ui->ShowStatus->setText("Not Working");
  4.         isnetopen=false;
  5.     }


//网口接收处理,接收并且显示
  1. void Widget::processPendingDatagrams()
  2. {
  3.     QByteArray temp;
  4.     do {
  5.         temp.resize(udpSocket.pendingDatagramSize());
  6.         udpSocket.readDatagram(temp.data(), temp.size());
  7.         qDebug()<<"Receiving";
  8.     } while (udpSocket.hasPendingDatagrams());
  9.     ui->textBrowser->insertPlainText(temp);
  10. }
离线downstairs

只看该作者 3楼 发表于: 2011-04-05
帮顶
喜爱编程的猫头鹰
离线wxj120bw

只看该作者 4楼 发表于: 2011-04-06
Note: An incoming datagram should be read when you receive the readyRead() signal, otherwise this signal will not be emitted for the next datagram

上面的注释楼主看下,是QUdpSocket的说明
离线reynoldxu

只看该作者 5楼 发表于: 2011-04-06
回 4楼(wxj120bw) 的帖子
那这种情况怎么处理?
离线wxj120bw

只看该作者 6楼 发表于: 2011-04-06
Re:回 4楼(wxj120bw) 的帖子
引用第5楼reynoldxu于2011-04-06 14:34发表的 回 4楼(wxj120bw) 的帖子 :
那这种情况怎么处理?

那你在打开时,再新建QUdpSocket对象
快速回复
限100 字节
 
上一个 下一个