c++ - 在 QML 上异步更新多个 QQuickPaintedItem

标签 c++ qt opencv qml qquickitem

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

在这个类中,有一个名为 queryFrame() 的插槽,它通过以下方式连接到 QTimer 超时 (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() 时,它都应该更新 View 。它正在执行此操作,但不是异步工作。

我应该如何让每个 CVCamScreen 都以独立的方式 self 更新?

呈现 CamScreens 的 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() 内容移动到后台线程中,当数据准备好时通知 CVCamScreenupdate() 应该被调用。

关于c++ - 在 QML 上异步更新多个 QQuickPaintedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26167760/

相关文章:

c++ - 如何使用 include-what-you-use 工具与 CMake 一起检测未使用的 header ?

c++ - std::list 的类型要求

c++ - 如何从输入文件 C++ 的行中读取多个数据变量?

c++ - 如何使用 Qt 获取文件的 SHA-1/MD5 校验和?

c++ - Qt 5.2 中如何获取联系人列表。

c++ - Pthreads,与 pthread_join(pthread_t, void**) 混淆

user-interface - 如何设计可移植模块化GUI应用程序?

matlab - 从 MATLAB 中的 MSER 检测获取区域点?

python-2.7 - 在opencv上的Videocapture之后读取总是返回false

c++ - 计算给定两组点的相似变换矩阵?