我正在尝试使用继承自 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()
内容移动到后台线程中,当数据准备好时通知 CVCamScreen
和 update()
应该被调用。
关于c++ - 在 QML 上异步更新多个 QQuickPaintedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26167760/