QT程序出现connect: Cannot connect (null)::readyRead()是什么问题。。。?

qt编译一个服务端程序,编译通过,从编译器run能正常启动,

服务端监听开始后,当客户端接入,输出窗口提示QObject::connect: Cannot connect (null)::readyRead() to TCPServer::recvData();图片说明发送消息会奔溃图片说明

我第一次运行这两个程序能够运行,消息互通,没有任何问题。几次后一发消息就提示奔溃。
后来我又把服务端跟客户端两个exe单独放到空文件夹里,用windeployqt.exe打包库文件那些,运行,开始几次也能正常通信,后来又开始奔溃。
输出窗口提示无法连接了。下面源码。

#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

namespace Ui {
class TCPServer;
}

class TCPServer : public QWidget
{
    Q_OBJECT
public:
    explicit TCPServer(QWidget *parent = 0);
    ~TCPServer();
private:
    Ui::TCPServer *ui;
    QTcpServer *server;
    QTcpSocket *socket;
public slots:
    void startServer();
    void sendMsg();
    void connetserver();
    void recvData();
};
#endif // TCPSERVER_H


------------------------.CPP-----------------------------

#include "tcpserver.h"
#include "ui_tcpserver.h"
const quint16 port=6666;
TCPServer::TCPServer(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TCPServer)
{
    ui->setupUi(this);
    server=new QTcpServer(this);
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(startServer()));
    connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(sendMsg()));



}

TCPServer::~TCPServer()
{
    delete ui;
}

void TCPServer::startServer(){
    server->listen(QHostAddress::Any,port);
    connect(server,SIGNAL(newConnection()),this,SLOT(connetserver()));


}

void TCPServer::connetserver(){
    //获取客户端
    socket=server->nextPendingConnection();
    connect(socket,SIGNAL(readyRead()),this,SLOT(recvData()));

}

void TCPServer::recvData(){
    QByteArray array=socket->readAll();
    if(!array.isEmpty()){
        ui->textEdit->append(QString::fromLocal8Bit(array));

    }


}
void TCPServer::sendMsg(){
    QString str=ui->textEdit_2->toPlainText();
    socket->write(str.toLocal8Bit());
    socket->flush();

}

2个回答

图片说明

看图片圈红的两处,书上的内容。在信号槽连接之后直接再调用一次槽函数。我也很纳闷为啥非得直接调用一次槽函数,不调用的话就出现你报的错误。

如果问题解决了,请采纳一下!

weixin_41803169
Bear丶丶 谢谢啦!我试了一下,不是这个问题。我找到了问题,我把程序打开的时候,习惯性连点几次启动服务器,每当点击一次按钮,startServer槽函数里server对象的信号函数会连接一次槽函数,我点击了多次,该对象的信号函数会多次连接这个槽函数,也就是connetserver()这个槽函数。导致server对象每放出一次信号时,connetserver()槽函数会调用多次,最后一次调用的槽函数里nextPendingConnection()函数返回不了新的连接,它返回的0替换掉了第一次槽调用里得到的那个正确的socket,导致socket指的东西不对了。也就调用不了socket里的readyread。可以将代码里startserver函数里监听那里上个if判断,connect在判断里。第一次点击监听后,后续的点击,监听函数会返回false,这样里头的connect就不会多次连接。再次谢谢这位兄弟啦。
一年多之前 回复

将startServer函数里的改动一下,点击多次启动服务器也不会出现问题
```void TCPServer::startServer(){
if( server->listen(QHostAddress::Any,port))
connect(server,SIGNAL(newConnection()),this,SLOT(connetserver()));
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐