我也觉得不是QT的原因,但不知道原因啊,我把完整代码发一下,请版主看看
/**************************************************************************************
/*接收方*/
///////////////////////////////////////////////
UDPClient.h
#ifndef UDPCLIENT_H
#define UDPCLIENT_H
#include <QWidget>
#include <QtNetwork>
namespace Ui {
class UDPClient;
}
class UDPClient : public QWidget
{
Q_OBJECT
public:
explicit UDPClient(QWidget *parent = 0);
~UDPClient();
private:
Ui::UDPClient *ui;
QImage *image;
QUdpSocket *udpSocket;
int i;
QFile file;
int filesize;
int filerevsize;
private slots:
void initSocket();
void readPendingDatagrams();
};
#endif // UDPCLIENT_H
///////////////////////////////////////////////
UDPClient.cpp
#include "udpclient.h"
#include "ui_udpclient.h"
UDPClient::UDPClient(QWidget *parent) :
QWidget(parent),
ui(new Ui::UDPClient)
{
ui->setupUi(this);
image = 0;
i=0;
filesize=0;
initSocket();
}
UDPClient::~UDPClient()
{
delete ui;
}
/**
* @brief UDPClient::initSocket
*/
void UDPClient::initSocket()
{
udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress::Any, 7755);
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
}
/**
* @brief UDPClient::readPendingDatagrams
*/
void UDPClient::readPendingDatagrams()
{
//receive
while (udpSocket->hasPendingDatagrams())
{
//ui->lstInfo->addItem("data coming ... ");
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
udpSocket->readDatagram(datagram.data(), datagram.size(),
&sender, &senderPort);
//file size
if (datagram.startsWith("filesize"))
{
ui->lstInfo->addItem("▼ begin rev data");
filesize = datagram.right(datagram.count()-8).toInt();
ui->lstInfo->addItem("filesize:"+ QString::number(filesize));
file.setFileName( "d:/rev.jpg" );
if (!file.open(QIODevice::WriteOnly | QIODevice::Unbuffered))
return;
filerevsize = 0;
i=1;
}
else //file data
{
file.write(datagram.data(),datagram.size());
filerevsize += datagram.size();
ui->lstInfo->addItem(QString::number(i) + " rv:" +
QString::number(datagram.size()) + " rvd:" +
QString::number(filerevsize)+ " all:" +
QString::number(filesize));
//file rev finish
if (filesize == filerevsize)
{
ui->lstInfo->addItem("▲ end rev data");
image = new QImage("d:/rev.jpg");
ui->lblImage->setPixmap(QPixmap::fromImage(*image).scaled(ui->lblImage->size()));
file.close();
file.remove("d:/rev.jpg");
}
qDebug() << i << datagram.size();
}
}
image = new QImage("d:/rev.jpg");
ui->lblImage->setPixmap(QPixmap::fromImage(*image).scaled(ui->lblImage->size()));
}
/*发送方*/
///////////////////////////////////////////////
UDPServer.h
#ifndef UDPSERVER_H
#define UDPSERVER_H
#include <QWidget>
#include <QtNetwork>
#include <QDesktopWidget>
namespace Ui {
class UDPServer;
}
class UDPServer : public QWidget
{
Q_OBJECT
public:
explicit UDPServer(QWidget *parent = 0);
~UDPServer();
private slots:
void on_btnOpenImage_clicked();
void shotScreen();
void sendData();
void initSocket();
private:
Ui::UDPServer *ui;
QDesktopWidget *desktop;
QTimer *timer;
QPixmap pixmap;
QUdpSocket *udpSocket;
QFile file;
int i;
int loadSize;
};
#endif // UDPSERVER_H
///////////////////////////////////////////////
UDPServer.cpp
#include "udpserver.h"
#include "ui_udpserver.h"
#include <QMainWindow>
#include <QTimer>
#include <QPixmap>
#include <QDesktopWidget>
#include <QDesktopServices>
#include <QFileDialog>
#include <QDir>
#include <QDateTime>
#include <QtDebug>
#include <QRect>
#include <QMessageBox>
#include <QPainter>
UDPServer::UDPServer(QWidget *parent) :
QWidget(parent),
ui(new Ui::UDPServer)
{
ui->setupUi(this);
desktop = QApplication::desktop();
loadSize = 512; //每次发送数据的大小 :40KB 字节
i=0;
initSocket();
}
UDPServer::~UDPServer()
{
delete ui;
}
void UDPServer::initSocket()
{
udpSocket = new QUdpSocket(this);
}
/**
* @brief 截图
*/
void UDPServer::on_btnOpenImage_clicked()
{
shotScreen();
}
/**
* @brief 截图函数
*/
void UDPServer::shotScreen()
{
pixmap = QPixmap::grabWindow(desktop->winId());
//保存图片:
pixmap.save("D:/1.jpg", "jpg");
ui->lblImage->setPixmap(this->pixmap.scaled(ui->lblImage->size()));
file.setFileName("D:/1.jpg");
if (!file.open(QIODevice::ReadOnly))
return;
ui->txtInfo->setText("file size: " + QString::number(file.size()) + " Byte");
//send filesize
ui->lstInfo->addItem("send filesize");
QByteArray datagram = "filesize"+QString::number(file.size()).toLatin1();
udpSocket->writeDatagram( datagram.data(), datagram.size(),
QHostAddress::Broadcast, 7755 );
sendData();
file.close();
}
/**
* @brief 发送数据
*/
void UDPServer::sendData()
{
i=0;
ui->lstInfo->addItem("▼ begin send data");
//if (!file.atEnd())
while (!file.atEnd())
{
QByteArray line = file.read(loadSize);
udpSocket->writeDatagram( line , QHostAddress::Broadcast, 7755 );
i++;
qDebug() << "send data! " << i << line.size() << file.atEnd();
ui->lstInfo->addItem(QString::number(i) + " " +
QString::number(line.size()));
}
ui->lstInfo->addItem("▲ end send data");
}