如何基于 QQuickPaintedItem C++ 类有效地更新 QML 项目?我将一些预处理委托给专用线程而不是 UI 线程上的计时器,并且它不再更新 QML UI 中的图像。
必须从 Qt 中的 UI 线程(包括 QML)触发 UI 更新。使该 CameraView 公开 public slot updateImage
。
class CameraView : public QQuickPaintedItem
{
Q_OBJECT
Q_DISABLE_COPY(CameraView)
public:
CameraView(QQuickItem* parent = nullptr);
public slots:
void updateImage(const QImage&);
protected:
QImage m_image;
};
CameraView 应该像updateImage
这样实现paint
:
void CameraView::updateImage(const QImage& image)
{
m_imageThumb = image; // does shallow copy of image data
update(); // triggers actual update
}
void CameraView::paint(QPainter* painter)
{
painter->drawImage(this->boundingRect(), m_image);
}
类OpenCvOnWorkerThread
应该启动它的工作线程并公开 signalUiUpdate:
OpenCvOnWorkerThread::OpenCvOnWorkerThread()
{
this->moveToThread(&m_workerThread);
// the below will allow communication between threads
connect(this, SIGNAL(signalUiUpdate(QImage)), m_cameraView, SLOT(updateImage(QImage)));
m_workerThread.start();
}
void OpenCvOnWorkerThread::cvRead()
{
QImage image;
// OpenCV details available in your code
// cv::read
// make QImage from frame
// deliver QImage to another thread
emit signalUiUpdate(image);
}
更新:在我自己的“相机”线程类似 QML 输出的代码中,当 UI 线程无法处理视频帧时,我还负责处理 UI 线程停顿,以便信号发送者知道何时不发布视频帧。但这值得另一个问题。或者这个整个例子可以在没有信号和槽但有条件变量的情况下重新实现。