绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。其中,
1.QPixmap专门为图像在屏幕上的显示做了优化,和平台相关,不能对图片进行修改;
2.QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap;
3.QImage专门为图像的像素级访问做了优化,可以对图片进行修改,可以在线程中绘图;
4.QPicture则可以记录和重现QPainter的各条命令,保存绘图的状态(二进制文件)。
例:使用QPixmap类的对象作为绘图设备
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QPainter>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
//这里因为我们不在窗口里面绘图,所以不用在MyWidget中重写paintEvent函数
//本次指定绘图设备是Pixmap
//绘图设备,400*300
QPixmap pixmap(400,300);
QPainter p(&pixmap);//创建画家对象并指定绘图设备
//填充背景色为白色,两种方法
pixmap.fill(Qt::white);
//p.fillRect(0,0,400,300,QBrush(Qt::white));
p.drawPixmap(0,0,80,80,QPixmap(":/new/prefix1/image/face.png"));
//因为没有在窗口上绘图,所以要保存图片才能看效果
pixmap.save("../pixmap.png");
}
MyWidget::~MyWidget()
{
delete ui;
}
例:使用QImage类的对象作为绘图设备
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QImage>
#include<QPainter>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
//创建一个绘图设备,QImage::Format_ARGB32背景是透明
QImage image(400,300,QImage::Format_ARGB32);
QPainter p(&image);
//绘图
p.drawImage(0,0,QImage(":/new/prefix1/image/face.png"));
//对绘图设备前50个像素点进行操作
for(int i=0;i<50;i++)
for(int j=0;j<50;j++)
{
image.setPixel(QPoint(i,j),qRgb(0,255,255));
}
image.save("../image.png");
}
MyWidget::~MyWidget()
{
delete ui;
}
例:使用QImage类的对象作为绘图设备
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include<QPaintEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~MyWidget();
protected:
void paintEvent(QPaintEvent *event);
private:
Ui::MyWidget *ui;
};
#endif // MYWIDGET_H
mywidget.cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include<QPainter>
#include<QPicture>
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
QPicture picture;
QPainter p(&picture);
p.drawPixmap(0,0,80,80,QPixmap(":/new/prefix1/image/face.png"));
p.end();//告诉系统终止记录(这句话别漏了!)
//保存的是二进制文件
picture.save("../picture.bin");
//接下来我们要把上面存的这个二进制文件在窗口上绘图
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
QPicture pic;
pic.load("../picture.bin");//加载二进制文件
p.drawPicture(0,0,pic);
}
最后看一下QPixmap-与QImage的相互转换:
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
QPixmap pixmap;
pixmap.load(":/new/prefix1/image/face.png");
//QPixmap-->QImage
QImage tempImage=pixmap.toImage();
p.drawImage(0,0,tempImage);
QImage image;
image.load(":/new/prefix1/image/Luffy.png");
//QImage-->QPixmap
QPixmap tempPixmap=QPixmap::fromImage(image);
p.drawPixmap(100,0,tempPixmap);
}