【发布时间】:2016-08-13 02:34:21
【问题描述】:
我不明白如何在 QML 中使用 QQuickPaintedItem 类(或者可能是其他方法?)显示图像。
我的程序目前正在使用QImage 和 ImageProvider 显示它,它可以工作但随机崩溃,所以我想尝试另一种方法。
此外,每次传输新帧时都应刷新图像。
我从uchar 原始数据中获取信息,但我不知道如何从原始数据中进行绘制。
此外,新的原始数据以大约 60 fps 的速度出现,因此 QML 需要以这个速率刷新图像。
编辑:
其他部分代码:
我的班级是:
class StreamPainter : public QQuickPaintedItem
{
Q_OBJECT
public:
StreamPainter(QQuickItem *p = 0):QQuickPaintedItem(p){}
~StreamPainter();
void paint(QPainter *painter){painter->drawImage(QPoint(0, 0), _streamImage);}
public slots:
void onImageAvailable(QImage image) {
_streamImage = image;
update();
private:
QImage _streamImage;
};
主要:
对于无效的属性名称,是由于导入StreamPainter 1.0,似乎不喜欢这个名称,因为它被混淆了,我已经将它更改为myModule并且错误消失了。
qmlRegisterType<StreamPainter>("myModule", 1, 0, "StreamPainter");
对象和线程的创建:
streamImage = new StreamPainter();
myPipeThread = new PipeThread(streamImage);
线程构造函数:
PipeThread::PipeThread(StreamPainter* spvideostr)
:QThread(),
_namedPipe(INVALID_HANDLE_VALUE),
_spvideostr(spvideostr),
_abort(false),
_rawData(NULL)
{
...
}
线程类,我已经添加了:
signals:
void imageAvailable(QImage image);
然后在我的线程中,我进行连接,同时我创建 QImage 并发出信号:
connect(this, SIGNAL(imageAvailable(QImage)), _spvideostr, SLOT(onImageAvailable(QImage)));
while(...)
QImage clImage(_rawData, IMG_WIDTH, IMG_HEIGHT, QImage::Format_Indexed8);
emit imageAvailable(clImage);
QML:
import QtQuick 2.0
import MyModule 1.0
StreamPainter {
width : 100
height : 100
【问题讨论】: