QT编程中遇到Segmentation Fault错误

Qt编写的界面程序中在没有点击连接服务的的按钮时,直接点击 发送 按钮,程序就会闪退,并且出现Segmentation Fault的提示,

QT编程中遇到Segmentation Fault错误_第1张图片

经过排查,发现是因为QTcpSocket建立的对象放在了 连接服务端 按钮的槽函数里边,只有点了连接服务端 的按钮,对象才会建立,而直接点 发送 按钮时候,对象并没有建立,所以会出现错误(就是还没建立对象,你就调用了,所以不知道用的哪里的对象)。

void SocketTCPClient::on_m_connectServerBtn_clicked()
{
//    mp_clientSocket = new QTcpSocket();这样做不正确!

    QString ip = ui->m_serverIPLineEdit->text();\
    int port = ui->m_serverPortLineEdit_2->text().toInt();

    mp_clientSocket->connectToHost(ip, port);

    if(!mp_clientSocket->waitForConnected(30000))
    {
        QMessageBox::information(this, "QT网络通信", "连接服务端失败!");
        return;
    }

    //当有消息到达时,会触发信号 SIGNAL:readyRead(), 此时就会调用槽函数ClientRecvData()
     connect(mp_clientSocket, SIGNAL(readyRead()), this, SLOT(ClientRecvData()));

}

void SocketTCPClient::on_pushButton_2_clicked()
{
    //获取TextEdit控件中的内容
    QString sendMsg = ui->m_sendTextEdit->toPlainText();

    //转换成字符串发送
    char sendMsgChar[1024] = {0};
    strcpy(sendMsgChar, sendMsg.toStdString().c_str());

    int sendRe = mp_clientSocket->write(sendMsgChar, strlen(sendMsgChar));

    if(sendRe == -1  )
    {
         QMessageBox::information(this, "QT网络通信", "向服务端发送数据失败!");
         return;
    }
}

解决办法:

     将对象的实例化放在构造函数中,这样会对象全局有效。
 


SocketTCPClient::SocketTCPClient(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::SocketTCPClient)
{
    ui->setupUi(this);
    mp_clientSocket = new QTcpSocket();
    ui->m_serverIPLineEdit->setText("127.0.0.1");
    ui->m_serverPortLineEdit_2->setText("5550");

}

 

你可能感兴趣的:(Qt)