2

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

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

什么是最好的让它实时?

4

1 回答 1

2

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

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

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

于 2012-08-17T18:03:52.147 回答