2016-07-12 7 views
1

한 사용자의 스크린 샷을 다른 사용자에게 보내려면 소켓 기반 프로그램을 만들고 있습니다. 전송하기 전에 스크린 샷을 바이트 배열로 변환해야합니다. 내 스크린 샷을 QByteArray으로 변환 한 후 배열의 시작 부분에 4 바이트를 삽입하여 그림임을 표시합니다 (숫자 20은 그림이고 텍스트가 아님).QPixmap.loadFromData()가 QByteArray에서 이미지를로드하지 않습니다.

다른 사용자에게 소켓을 통해 바이트 배열을 보낸 후에 수신되면 처음 4 바이트를 읽으면 무엇인지 알 수 있습니다. 사진 이었기 때문에 나는 QByteArray에서 QPixmap으로 변환하여 레이블에 표시했습니다. 로드하려면 secondPixmap.loadFromData(byteArray,"JPEG")을 사용하지만 어떤 그림도로드하지 않습니다.

void MainWindow::shootScreen() 
{ 
    originalPixmap = QPixmap(); // clear image for low memory situations 
          // on embedded devices. 
    originalPixmap = QGuiApplication::primaryScreen()->grabWindow(0); 
    scaledPixmap = originalPixmap.scaled(500, 500); 

    QByteArray bArray; 
    QBuffer buffer(&bArray); 
    buffer.open(QIODevice::WriteOnly); 
    originalPixmap.save(&buffer,"JPEG",5); 

    qDebug() << bArray.size() << "diz0"; 

    byteArray= QByteArray(); 

    QDataStream ds(&byteArray,QIODevice::ReadWrite); 
    int32_t c = 20; 
    ds << c; 
    ds<<bArray; 
} 

void MainWindow::updateScreenshotLabel() 
{ 
    this->ui->label->setPixmap(secondPixmap.scaled(this->ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); 
} 

void MainWindow::on_pushButton_clicked() 
{ 
    shootScreen(); 
} 

void MainWindow::on_pushButton_2_clicked() 
{ 
    secondPixmap = QPixmap(); 
    QDataStream ds(&byteArray,QIODevice::ReadOnly); 
    qint32 code; 
    ds>>code; 
    secondPixmap.loadFromData(byteArray,"JPEG"); 
    updateScreenshotLabel(); 
} 

답변

2

귀하의 MainWindow::on_pushButton_2_clicked 구현이 이상한 같습니다

내 코드의 샘플입니다. 당신은 ... 그것은 byteArray에서 입력 데이터의 읽을 읽기 전용 QDataStream를 생성

QDataStream ds(&byteArray,QIODevice::ReadOnly); 

있습니다. 완전히 QDataStream 우회 - 그러나 나중에합니다 ... 같은QByteArray에서 직접 QPixmap 읽기를 시도

secondPixmap.loadFromData(byteArray,"JPEG"); 

있습니다.

QDataStream에서 읽고 쓰는 고정 멤버 QPixmap을 사용할 수도 있습니다. 그래서 당신이 뭔가를 찾고 있다고 생각합니다. ...

QDataStream ds(&byteArray,QIODevice::ReadOnly); 
qint32 code; 
ds >> code; 
if (code == 20) 
    ds >> secondPixmap; 

마찬가지로 MainWindow::shootScreen 구현을 위해. QDataStream & operator<<(QDataStream &stream, const QPixmap &pixmap)을 사용하면 코드를 상당히 줄일 수 있습니다.

+0

해결 부탁드립니다. – amir