maysam
maysam

Reputation: 519

Update Qt GUI in Loop ( show Bitmap image as movie )

i receive screenshot as bitmap from socket and when i show only one of them it work but when i put in loop ( show all receive image to make movie) i get hang

void ShowImageBuffer(char* buf,int sizeofimagebuffer )
{
    QByteArray byte=QByteArray::fromRawData(buf, sizeofimagebuffer );
    QPixmap  image;
    if(image.loadFromData(byte,"BMP"))
    {
        ui->label->setPixmap(image);
        ui->label->update();
    }
}



  while(1)
 {
        ShowImageBuffer(buf, sizeofimagebuffer)
 }

i must use separate thread?( but i think we will not use any thread to change GUI?)

what is best to make it real time?

Upvotes: 3

Views: 2547

Answers (1)

Luca Carlon
Luca Carlon

Reputation: 9986

The problem I suppose is that you're not returning to the event loop this way. The update() method you're using doesn't repaint the QWidget immediately. It schedules a request to update the area, which is unified with other pending requests if any is available. This request is processed when the execution returns to the event loop. It is clearly stated in the documentation.

You might want to use a QTimer and invoke the ShowImageBuffer method at a specific frame rate. When the ShowImageBuffer is finished, execution returns to the event loop thus giving the time to process the update() request. Also consider the improvement suggested by AJG85.

Otherwise you can have a look at the repaint() method which immediately invokes the paintEvent() method, but still I suppose you should set a specific frame rate to get a good result. I would go with the QTimer way.

Upvotes: 2

Related Questions