Qt使用QPainter绘制方式显示图片
1、前言
- 在Qt里如果需要显示图片最先想到的就是用一个
QLabel
来显示,一行代码就可以,十分简单,但如果需要频繁的更新图片,比如显示视频,那用QLabel
就不行了,效率会比较低,导致界面会很卡; - 这时就可以用
QPainter
绘制图片和OpenGL
绘制图片来提升效率了; - 而
OpenGL
使用会比较复杂,对于小白来说不是很友好; - 所以如果不是显示大图片、大数据量的图片或者高刷新率的话用QPainter绘制足够了;
- 在这个Demo中使用
QPainter
绘制方式同时以50Hz频率显示64路图片毫无压力(图片不是很大); - 支持传入
QPixmap、QImage
两种格式; - 使用简单(主要代码不超过50行),没有第三方依赖,使用与所有平台、任意编译器;
- 支持自适应窗口缩放图片,并且保持纵横比。
2、主要代码
#ifndef PLAYIMAGE_H
#define PLAYIMAGE_H
#include <QWidget>
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
#include "playimage.h"
#include <QPainter>
PlayImage::PlayImage(QWidget *parent) : QWidget(parent)
{
}
void PlayImage::updateImage(const QImage& image)
{
updatePixmap(QPixmap::fromImage(image));
}
void PlayImage::updatePixmap(const QPixmap &pixmap)
{
m_pixmap = pixmap;
update();
}
void PlayImage::paintEvent(QPaintEvent *event)
{
if(!m_pixmap.isNull())
{
QPainter painter(this);
#if 0
QPixmap pixmap = QPixmap::fromImage(m_image.scaled(this->size(), Qt::KeepAspectRatio));
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);
}
3、实现效果

4、源代码
gitee
github
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界