在学习QT的时候,撸一下前辈开放的教程代码。使用TcpServer的时候,出现无法监听newConnetion的情况。
代码如下:
void MainWindow::on_btnStart_clicked() 2 { 3 if (!tcpServer.listen(QHostAddress::Any,ui->txtPort->text().toInt())) 4 { 5 ui->labCount->setText(tr("提示:发生错误(%1)").arg(tcpServer.errorString())); 6 tcpServer.close(); 7 return; 8 } 9 connect(&tcpServer,SIGNAL(newConnection()),this,SLOT(AcceptConnection())); 10 11 ui->btnStart->setEnabled(false); 12 ui->btnSend->setEnabled(true); 13 ui->labCount->setText(tr("提示:正在监听")); 14 } 15 16 void MainWindow::AcceptConnection() 17 { 18 tcpServerConnection = tcpServer.nextPendingConnection(); 20 connect(tcpServerConnection,SIGNAL(readyRead()),this,SLOT(ReadMyData())); 22 23 tcpServer.close(); //不再连接其他客户端 24 ui->labCount->setText(tr("提示:客户端连接成功")); 25 }
按照网上说的,试过把防火墙关闭重启,仍然无法正常监听,现象就是客户端显示连接成功,无法收到newConnection的signal。
最后发现是connect出现问题,把开启监听成功后的connect改成如下:
connect(&tcpServer, &QTcpServer::newConnection, this, &MainWindow::AcceptConnection);
则问题得到解决。
我的理解是:网上能搜到的代码都是5.0之前的版本,使用SIGNAL()和SLOT()搭配确定信号和处理函数的对应;
5.0之后connect函数推荐使用上面这种情况,相对前面的方式,显式的表明信号函数的发送主题和槽函数的归属。这里始终得不到newConnection,应该就是信号发送的主体可能出现问题。
同样的,后面也出现了相同的无法收到readyRead信号的问题。
connect(tcpServerConnection,SIGNAL(readyRead()),this,SLOT(ReadMyData()));
更改成如下问题同样得到了解决。
connect(tcpServerConnection,&QTcpSocket::readyRead ,this, &MainWindow::ReceiveData);
理解可能有偏差,但问题能够得到解决。