2014-09-04 27 views
0

我正在使用Qt5,我試圖通過QDataStream中的QByteArray數據包通過QUdpProtocol發送QPixmap。發送像素映射很簡單:QPixmap通過QUdpSocket - 無法讀取正確的數據

QByteArray block; 
QDataStream out(&block, QIODevice::WriteOnly); 

out.setVersion(QDataStream::Qt_5_0); 
out << (quint32)0; 
out << pixmap; 
out.device()->seek(0); 
out << (quint32)(block.size() - sizeof(quint32)); 

socket->write(block); 
qDebug() << "Block size:" << (float)(block.size()/1024.f) << "KB"; 

但閱讀...什麼也沒有發生 - 我的意思是,QLabel不填充任何改變,任何錯誤消息(和正確的嗎?)。

QByteArray buffer; 
buffer.resize(sock->pendingDatagramSize()); 
sock->readDatagram(buffer.data(), buffer.size(), &remoteAddr, &remotePort); 

if (sock->bytesAvailable() > 0) 
    return; 

QDataStream out(&buffer, QIODevice::ReadOnly); 
out.setVersion(QDataStream::Qt_5_0); 

QPixmap p; 
//out.device()->seek(0); 
out >> p; 
ui->label->setPixmap(p); 

我知道在UDP數據包碎片,但我試圖發送50個像素,20,10,5,最後 - 1.沒有。 兩個程序顯示相同的字節數(發送和接收)。如果這很重要,我將兩個套接字綁定在QHostAddress::LocalHost的同一端口上,但原始文本已成功發送。

我做錯了什麼?

+0

使用調試器,我發現一個區別 - 收到的數據比發送代碼的數據(開始處)少1個「\ 000」塊。這只是兩個應用程序中的數據之間的差異。 – aso 2014-09-04 18:35:01

回答

0

呵呵,成功了。
因特網上的代碼是無效。我試過這種方式:

QByteArray frame; 

QDataStream out(&frame, QIODevice::WriteOnly); 
out << myPixmap; 

QDataStream in(&frame, QIODevice::ReadOnly); 
QPixmap pix2; 
in >> pix2; 
ui->label->setPixmap(pix2); 

它的工作原理和它很容易。

在Qt5字節開始大小是不需要的。另外,通過TCP/UDP傳輸也可以正常工作(如果遇到麻煩,請記住最大數據包大小)。