使用Qt widget封装一个显示YUV数据的类
时间: 2024-03-17 11:40:04 浏览: 72
SDL显示yuv视频以及库文件都在里面
好的,以下是一个简单的Qt widget封装的YUV数据显示类:
```cpp
// yuvwidget.h
#ifndef YUVWIDGET_H
#define YUVWIDGET_H
#include <QWidget>
#include <QImage>
class YUVWidget : public QWidget
{
Q_OBJECT
public:
explicit YUVWidget(QWidget *parent = nullptr);
virtual ~YUVWidget();
void setYUVData(unsigned char *yuvData, int width, int height);
protected:
virtual void paintEvent(QPaintEvent *event);
private:
QImage m_image;
unsigned char *m_yuvData;
int m_width;
int m_height;
};
#endif // YUVWIDGET_H
// yuvwidget.cpp
#include "yuvwidget.h"
#include <QPainter>
YUVWidget::YUVWidget(QWidget *parent) : QWidget(parent),
m_yuvData(nullptr), m_width(0), m_height(0)
{
}
YUVWidget::~YUVWidget()
{
if (m_yuvData != nullptr) {
delete [] m_yuvData;
}
}
void YUVWidget::setYUVData(unsigned char *yuvData, int width, int height)
{
if (m_yuvData != nullptr) {
delete [] m_yuvData;
}
m_yuvData = new unsigned char[width * height * 3 / 2];
memcpy(m_yuvData, yuvData, width * height * 3 / 2);
m_width = width;
m_height = height;
m_image = QImage(m_yuvData, m_width, m_height, QImage::Format_YUV420P);
m_image = m_image.rgbSwapped();
update();
}
void YUVWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawImage(QPoint(0, 0), m_image);
}
```
在这个类中,我们使用QImage来管理YUV数据的内存并显示。在setYUVData函数中,我们首先使用new来分配足够的内存来存储YUV数据,并将其复制到新分配的内存中。然后使用QImage的构造函数来创建一个QImage对象,该对象指向我们刚刚分配的内存,格式为QImage::Format_YUV420P(这是默认格式,也可以根据需要选择其他格式)。最后,我们调用rgbSwapped函数来将图像颜色空间从YUV转换为RGB,并更新窗口以显示图像。
在paintEvent函数中,我们使用QPainter来在窗口中绘制图像。
阅读全文