如何基于 QQuickPaintedItem C++ 高效更新 QML 项目
班级?我将一些预处理委托给专用线程而不是
UI 线程上的计时器,它不再更新 QML UI 中的图像。
在 Qt(包括 QML)中,必须从 UI 线程触发 UI 更新。使 CameraView 公开公共插槽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
and 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);
}
ClassOpenCvOnWorkerThread
应该启动其工作线程并公开 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);
}
UPDATE:在我自己的来自“相机”线程的类似 QML 输出的代码中,我还负责在无法处理视频帧时处理 UI 线程停顿,以便信号发送者知道何时不发布视频帧。但这值得另一个问题。或者可以在没有信号和槽但有条件变量的情况下重新实现整个示例。