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

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

问题现象

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

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

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

尝试过的解决方法

不过最终处理都是指向: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;
    }
}
  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Qt中,可以通过信号与槽机制实现多线程刷新界面。具体步骤如下: 1. 在主线程中创建一个QObject对象,并将其与需要更新的UI元素绑定。 2. 在另一个线程中创建一个QThread对象,并将QObject对象移动到该线程中。 3. 在QThread类中定义一个更新UI的槽函数,并将其与QObject对象的信号连接起来。 4. 在需要更新UI的地方,调用QObject对象的信号即可触发QThread对象中的槽函数,从而更新UI。 下面是一个简单的示例代码: ```cpp //在主线程中创建QObject对象,并将其与需要更新的UI元素绑定 QObject* pObject = new QObject(this); connect(pObject, SIGNAL(updateUI()), ui->label, SLOT(update())); //在另一个线程中创建一个QThread对象,并将QObject对象移动到该线程中 QThread* pThread = new QThread(); pObject->moveToThread(pThread); //在QThread类中定义一个更新UI的槽函数,并将其与QObject对象的信号连接起来 class Worker : public QObject { Q_OBJECT public slots: void onUpdateUI() { emit updateUI(); } }; Worker* pWorker = new Worker(); connect(pObject, SIGNAL(updateUI()), pWorker, SLOT(onUpdateUI())); //启动线程 pThread->start(); //在需要更新UI的地方,调用QObject对象的信号即可触发QThread对象中的槽函数,从而更新UI emit pObject->updateUI(); ``` 需要注意的是,更新UI的操作必须在主线程中执行,因此在槽函数中需要使用Qt的线程安全函数来更新UI,例如QMetaObject::invokeMethod()函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aron566

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值