QT界面在多线程下的实时刷新

QT界面在多线程下的实时刷新

  • 问题现象
    • 尝试过的解决方法
  • 最终处理

问题现象

主界面:4个Lable控件,用作视频图片的显示,不过为了主线程的操作顺滑,使用了四个线程去采集视频流,采集到直接设置图片显示到Lable上

VIDEOlabel->setPixmap(QPixmap::fromImage(imgScaled));

后来运行后,发现界面视频刚开始可以正常运行显示也很流畅,大约2min左右开始视频显示卡顿,有时只有一个Lable在正常显示刷新,有时4个全部不刷新,不过通过窗口最小化或者点击界面中的按钮切换到下一个界面再返回界面又会正常刷新了,不过坚持不了多长时间。

尝试过的解决方法

  • 参考博客:只在主线程中调用update(),此方法在使用后,调用频率高小于40ms会偶发程序直接崩溃,但是未能解决问题,实测下来界面保持刷新时间变长而已。
  • VIDEOlabel->repaint();方式,不行。
  • 参考博客:重写showEvent函数,实测没用。

不过最终处理都是指向:UI界面的对象操作只在主线程中执行。

最终处理

线程中,采集到最新的图像通过信号与槽发送到主线程中执行

emit UpdateWidgetSignalx(pixmap);/**< 发送更新控件信号*/

主线程中接收信号,调用槽函数前去处理

/**
 * @brief MainWindow::slotUpdateWidgetx
 * @param winindex
 * @param VideoWindow
 */
void MainWindow::slotUpdateWidgetx(quint8 winindex ,QPixmap &VideoWindow)
{
    if(winindex <= 0)
    {
        return;
    }
    char windowstr = 'A'+static_cast<char>(winindex)-1;
    switch(windowstr)
    {
        case 'A':
            VIDEOAlabel->setPixmap(VideoWindow);
            break;
        case 'B':
            VIDEOBlabel->setPixmap(VideoWindow);
            break;
        case 'C':
            VIDEOClabel->setPixmap(VideoWindow);
            break;
        case 'D':
            VIDEODlabel->setPixmap(VideoWindow);
            break;
        default:
            break;
    }
}

你可能感兴趣的:(QT)