我在写了个小程序 ,就是在两台计算机上TCP传输图片:服务器一直监听端口,如果客户端连接,服务器就向客户端发送一张JPG图片,然后客户端接收后显示出来。中间却遇到了一个实在搞不明白的问题,客户端主要程序如下:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
mySocket = new QTcpSocket(this);
connect(mySocket,SIGNAL(readyRead()),this,SLOT(if_finished()));
mySocket->connectToHost("59.64.147.32",
9988);
}
MainWindow::~MainWindow()
{
}
void MainWindow::if_finished()
{
if(mySocket->bytesAvailable() < image->height()*image->width()*3)
{
return;
}
else
getImage();
}
void MainWindow::getImage()
{
image = new QImage( "" );//c:\\TEST.jpg
QMessageBox::information( 0,"infor","finished"); //为什么这行去掉了 ,就显示不出来图片了:界面停顿下就不见了,没有看到图片。这句话如果存在,弹出来以后点击一下finished 图片就弹出来了。求解为什么?
QDataStream in(mySocket);
in >> (*image);
// setText( "" );
label=new QLabel(this);
label->setPixmap(QPixmap::fromImage(*image));
//label->move(50,5);
resize( image->size() );
label->resize( image->size() );
label->show();
}
小弟实在不明白 求大牛指点 为啥 图片显示和QMessageBox有关系了? 难道是我的程序有BUG?
------解决方案--------------------
下面是我写的一些方法 你可以参照一下 或许会有些小提醒...
/************************************************************************/
/* 方法一: 将图片保存下来 然后直接显示保存的图片 */
/************************************************************************/
/*QByteArray data=tcpSocket->readAll();
fileName="C:/image.jpg";
QFile file(fileName);
if(file.open(QIODevice::WriteOnly | QIODevice::Append))
file.write(data);
QPixmap * pixmap=new QPixmap(fileName);
QPixmap pix=pixmap->scaled(label->size());
label->setPixmap(pix);
label->show();
file.close();*/
/************************************************************************/
/* 第二种方法 直接接收显示服务器发送的 图片 */
/************************************************************************/
QByteArray temp=tcpSocket->readAll();//读取图片的所有字节
if(!temp.contains("####"))//判断是否接收到####字符没有的话就直接追加给data
{
data.append(temp);
}else // 有的话 就截取字符 然后追加给data
{
temp=temp.mid(0,temp.length()-4);
data.append(temp);
QImage image((uchar*)data.data(),100,100,QImage::Format_ARGB32);// 开辟一个新的图片
QPixmap pixmap=QPixmap::fromImage(image);
QPixmap pix=pixmap.scaled(label->size());
label->setPixmap(pix);
label->show();
}
------解决方案--------------------
也就是说
- C/C++ code
if(mySocket->bytesAvailable() < image->height()*image->width()*3){ return;}