我在学习QT正好在学TCP时找到的例子里用QWidget建的项目是能正常运行,但是我改用QMainWindow建项目运行时调试运行时报“Segmentation fault”错误,编译都是正常的,只有在发送时报这个错。
我的开发环境是XP,QT装的是4.7.4,用的是Qt Creator开发环境。
报错的地方是这里(tcpSocket->connectToHost(address, pord);),最不明白的就是运行时是从操作系统里报出来,我是通过调试里才找到这个错误。
下面是代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::seedMSG()
{
if (!ui->seedLineEdit->text().isNull() && ui->seedLineEdit->text().length() > 0) {
sendCount++;
blockSize = 0; //初始化其为0
QString address;
quint16 pord;
address = ui->hostLineEdit->text();
pord = ui->portLineEdit->text().toInt();
tcpSocket->abort(); //取消已有的连接
try
{
tcpSocket->connectToHost(address, pord);//连接到主机,这里从界面获取主机地址和端口号
}
catch (QString exception)
{
QString s = exception;
QMessageBox::about(0,"error",s);
}
tcpSocket->write(ui->seedLineEdit->text().toAscii().data()); //发送seedLindeEdit的内容
ui->seedLineEdit->clear();
tcpSocket->close();
ui->seedLineEdit->setFocus(); //让seedLineEdit获取焦点
} else {
qDebug() << "error else";
}
}
void MainWindow::readMSG()
{
QDataStream in(tcpSocket);
// in.setVersion(QDataStream::Qt_4_7);
//设置数据流版本,这里要和服务器端相同
if(blockSize==0) //如果是刚开始接收数据
{
//判断接收的数据是否有两字节,也就是文件的大小信息
//如果有则保存到blockSize变量中,没有则返回,继续接收数据
if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
in >> blockSize;
}
if(tcpSocket->bytesAvailable() < blockSize) return;
//如果没有得到全部的数据,则返回,继续接收数据
in >> serverMSG;
//将接收到的数据存放到变量中
ui->messageLabel->setText(serverMSG);
//显示接收到的数据
}
void MainWindow::displayError(QAbstractSocket::SocketError)
{
qDebug() << tcpSocket->errorString(); //输出错误信息
}
void MainWindow::on_pushButton_clicked()
{
this->seedMSG();
}