更多精彩内容 |
---|
个人内容分类汇总 |
QLabel
来显示,一行代码就可以,十分简单,但如果需要频繁的更新图片,比如显示视频,那用QLabel
就不行了,效率会比较低,导致界面会很卡;QPainter
绘制图片和OpenGL
绘制图片来提升效率了;OpenGL
使用会比较复杂,对于小白来说不是很友好;QPainter
绘制方式同时以50Hz频率显示64路图片毫无压力(图片不是很大);QPixmap、QImage
两种格式;#ifndef PLAYIMAGE_H
#define PLAYIMAGE_H
#include
class PlayImage : public QWidget
{
Q_OBJECT
public:
explicit PlayImage(QWidget *parent = nullptr);
void updateImage(const QImage& image);
void updatePixmap(const QPixmap& pixmap);
signals:
protected:
void paintEvent(QPaintEvent *event) override;
private:
QPixmap m_pixmap;
};
#endif // PLAYIMAGE_H
#include "playimage.h"
#include
PlayImage::PlayImage(QWidget *parent) : QWidget(parent)
{
}
/**
* @brief 传入Qimage图片显示
* @param image
*/
void PlayImage::updateImage(const QImage& image)
{
updatePixmap(QPixmap::fromImage(image));
}
/**
* @brief 传入QPixmap图片
* @param pixmap
*/
void PlayImage::updatePixmap(const QPixmap &pixmap)
{
m_pixmap = pixmap;
update();
}
/**
* @brief 使用Qpainter显示图片
* @param event
*/
void PlayImage::paintEvent(QPaintEvent *event)
{
if(!m_pixmap.isNull())
{
QPainter painter(this);
#if 0
// 经过粗略测试,QImage先缩放后转为QPixmap的方式在图像比较小时耗时少,图片越大耗时远大
QPixmap pixmap = QPixmap::fromImage(m_image.scaled(this->size(), Qt::KeepAspectRatio));
// 先将QImage转换为QPixmap再进行缩放则耗时比较少,并且稳定,不会因为缩放图片大小而产生太大影响
QPixmap pixmap1 = QPixmap::fromImage(m_image).scaled(this->size(), Qt::KeepAspectRatio);
#endif
QPixmap pixmap = m_pixmap.scaled(this->size(), Qt::KeepAspectRatio);
int x = (this->width() - pixmap.width()) / 2;
int y = (this->height() - pixmap.height()) / 2;
painter.drawPixmap(x, y, pixmap);
}
QWidget::paintEvent(event);
}
gitee
github