18 绘图系统(QPaintDevice类)
代码资源:https://download.csdn.net/download/qq_36926037/85052673
18.1 绘图概述及项目创建
18.1.1 绘图概述
绘图设备是继承自QPaintDevice类的子类,QT一共提供了四个绘图设备类:
(1)QPixmap专门为图像在不同屏幕(平台)上的显示做了优化
(2)QBitmap是QPixmap的一个子类,它的色深限制为1,可以使用QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap
(3)QImage专门为图像的像素级访问做出优化
(4)QPicture则可以记录和重现QPainter的各条命令,保存的图像格式为任意(自定义)格式
18.1.2 项目创建
创建项目,详细过程步骤:https://blog.csdn.net/qq_36926037/article/details/123720720
18.2 QPixmap绘图设备
前提:包含QPixmap头文件
QPixmap:对不同平台的显示做了优化
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/*################QPixmap绘图设备:专门为平台做了显示优化###############*/
//(1)QPixmap绘图设备
//#include <QPixmap>
QPixmap pix(300,300);
pix.fill(Qt::white);
//(2)声明画家
//#include <QPainter>
QPainter painter(&pix);//绘图设备和画笔绑定
//(3)绘制
painter.setPen(QPen(Qt::green));
painter.drawEllipse(QPoint(150,150),100,100);
//(4)保存
pix.save("D:\\pixmap.png");
}
Widget::~Widget()
{
delete ui;
}
18.3 QImage绘图设备
前提:包含QImage头文件
18.3.1 绘图
案例1:
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/*################QImage绘图设备:可以对像素进行操作###############*/
//(2)QImage绘图设备
//#include <QImage>
QImage img(300,300,QImage::Format_RGB32);
img.fill(Qt::white);
//(2)声明画家
//#include <QPainter>
QPainter painter(&img);//绘图设备和画笔绑定
//(3)绘制
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150),100,100);
//(4)保存
img.save("D:\\img.png");
}
Widget::~Widget()
{
delete ui;
}
18.3.2 像素级操作
(1)添加资源文件参考:https://blog.csdn.net/qq_36926037/article/details/123687483
(2)创建绘图事件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//绘图事件
void paintEvent(QPaintEvent *ev);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/*################QImage绘图设备:可以对像素进行操作###############*/
//(2)QImage绘图设备
//#include <QImage>
QImage img(300,300,QImage::Format_RGB32);
img.fill(Qt::white);
//(2)声明画家
//#include <QPainter>
QPainter painter(&img);//绘图设备和画笔绑定
//(3)绘制
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150),100,100);
//(4)保存
img.save("D:\\img.png");
}
//重写绘图事件
void Widget:: paintEvent(QPaintEvent *ev)
{
//利用QImage对像素进行修改
//(1)创建设备
QImage img;
img.load(":/image/1.png");
//(2)创建画笔
QPainter painter(this);
//(3)修改像素点
for(int i=50;i<100;i++)
{
for (int j=50;j<100;j++)
{
QRgb value=qRgb(0,255,0);
img.setPixel(i,j,value);
}
}
//(4)绘图
painter.drawImage(0,0,img);
}
Widget::~Widget()
{
delete ui;
}
18.4 QPicture绘图设备
18.4.1 绘图
前提:包含 QPicture头文件
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
#include <QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/*################QPicture绘图设备:可以记录和重新绘图指令###############*/
//(1)QPicture绘图设备
//#include <QPicture>
QPicture pic;
//(2)声明画家
//#include <QPainter>
QPainter painter(&pic);//绘图设备和画笔绑定
//(3)开始绘制
painter.begin(&pic);//开始在pic设备上绘画
painter.setPen(QPen(Qt::red));
painter.drawEllipse(QPoint(150,150),100,100);
//(4)结束绘制
painter.end();
//(5)保存
pic.save("D:\\pic.zt");
}
Widget::~Widget()
{
delete ui;
}
18.4.2 重现绘图指令
(1)声明绘图事件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
//绘图事件
void paintEvent(QPaintEvent *ev);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
(2)实现绘图事件
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
#include <QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
/*################QPicture绘图设备:可以记录和重现绘图指令###############*/
//(1)QPicture绘图设备
//#include <QPicture>
QPicture pic;
//(2)声明画家
//#include <QPainter>
QPainter painter(&pic);//绘图设备和画笔绑定
//(3)开始绘制
painter.begin(&pic);//开始在pic设备上绘画
painter.setPen(QPen(Qt::red));
painter.drawEllipse(QPoint(150,150),100,100);
//(4)结束绘制
painter.end();
//(5)保存
pic.save("D:\\pic.zt");
}
void Widget:: paintEvent(QPaintEvent *ev)
{
//(1)重现QPicture绘图指令
QPicture pic;
pic.load("D:\\pic.zt");
//(2)创建画笔
QPainter painter(this);
//(3)绘图
painter.drawPicture(0,0,pic);
}
Widget::~Widget()
{
delete ui;
}