在循环中更新Qt GUI(将位图图像显示为电影)

时间:2012-08-17 17:21:53

标签: c++ multithreading qt user-interface

我从套接字接收截图作为位图,当我只显示其中一个时它工作 但是当我放入循环(显示所有接收图像制作电影)时,我会挂起

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)
 }

我必须使用单独的线程?(但我认为我们不会使用任何线程来更改GUI?)

什么是最好的实时?

1 个答案:

答案 0 :(得分:2)

我想问的是你没有以这种方式返回事件循环。您正在使用的update()方法不会立即重新绘制QWidget。它会安排更新区域的请求,该请求与其他待处理请求(如果有)一致。执行返回事件循环时处理此请求。文件中明确说明了这一点。

您可能希望使用QTimer并以特定帧速率调用ShowImageBuffer方法。当ShowImageBuffer完成时,执行返回到事件循环,从而给出处理update()请求的时间。还要考虑AJG85建议的改进。

否则,您可以查看立即调用paintEvent()方法的repaint()方法,但我认为您应该设置特定的帧速率以获得良好的结果。我会选择QTimer方式。