异步更新QML上的多个QQuickPaintedItem

Asynchronously update multiple QQuickPaintedItem on QML

本文关键字:QQuickPaintedItem 更新 QML 异步      更新时间:2023-10-16

我正在尝试使用一个继承自QQuickPaintedItem的类来显示用openCV捕获的视频帧。

在这个类中,有一个名为queryFrame()的插槽,它通过:连接到一个QTimer timout(40ms)

connect(m_timer, SIGNAL(timeout()), this, SLOT(queryFrame()));

queryFrame()代码:

void CVCamScreen::queryFrame()
{
    if(!m_url.isEmpty()){
        if( !m_capture->isOpened() ) {
            m_capture->open( m_url.toStdString() );
        }
        cv::Mat frame;
        m_capture->read( frame );
        m_qImage = ipl2Qimg(new IplImage(frame));
        update();
        emit frameChanged();
    }
}

每次调用queryFrame()时,都应该更新视图。它正在这样做,但它不是异步工作的。

我应该如何使每个CVCamScreen以独立的方式进行更新?

呈现摄像头屏幕的QML代码:

Repeater {
    model: 8
    CVCamScreen {
        Layout.fillWidth: true
        Layout.fillHeight: true
        url: Controller.urlCanal(index + 1)
        CustomBorder {
            commonBorder: true
            color: "#228e14"
            commonBorderWidth: 3
        }
        onUrlChanged: {
            start(); // starts the timer when the URL changes.
        }
    }
}

您的问题是所有CVCamScreen对象都在同一个线程中。因此,计时器事件是按顺序传递给它们的。我建议将设备和ipl2Qimg()内容的实际读取移动到后台线程中,该线程只会在数据准备好并且应该调用update()时通知CVCamScreen

相关文章:
  • 没有找到相关文章