绘图工具
1.画家
#include<QPainter>
构造函数
2.画笔
#include<QPen>
构造函数
3.画刷
#include<QBrush>
构造函数
4.绘图设备
QPixmap:针对屏幕进行优化,和平台有关,不能对图片进行修改
QImage:和平台无关,可以对图片进行修改,在线程中绘图
QPicture:保存绘图的状态(二进制文件)
QPixmap
针对屏幕进行优化,和平台有关,不能对图片进行修改
用法
用下面简单的代码实现向主窗口绘图
--------------------------Widget.h--------------------------
------------------------------------------------------------
#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();
protected:
//绘图事件
void paintEvent(QPaintEvent *);
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
int x;
};
#endif // WIDGET_H
--------------------------Widget.cpp--------------------------
--------------------------------------------------------------
void Widget::paintEvent(QPaintEvent *)
{
//QPainter p(this);
QPainter p;//创建画家对象
p.begin(this);//指定当前窗口为绘图设备
//绘图操作
//定义画笔
QPen pen;
pen.setWidth(5);
pen.setColor(QColor(14,9,234));
pen.setStyle(Qt::DashDotLine);
//创建画刷对象
QBrush brush;
brush.setColor(Qt::red);
brush.setStyle(Qt::Dense1Pattern);
//画笔交给画家
p.setPen(pen);
//画直线
p.drawLine(50,50,150,50);
p.drawLine(50,50,50,150);
//画矩形
p.drawRect(150,150,100,50);
//画圆形
p.drawEllipse(QPoint(150,150),50,25);//圆心,上端距圆心距离,下端距圆心距离
//加载图片
p.drawPixmap(x,180,80,80,QPixmap("../Image/233.jpg"));//此处格式表示是上级目录里的文件Image
//里的2333.jpg图片
p.end();
}
不用窗口作为绘图设备,在Widget的构造函数实现
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPixmap pixmap(400,300);
QPainter p(&pixmap);
//画家填充背景色
p.fillRect(0,0,400,300,QBrush(Qt::white));
pixmap.fill(Qt::blue);
p.drawPixmap(0,0,80,80,QPixmap("../me/t012f79c8d50e170027.jpg"));
//保存图片
pixmap.save("../pixmap.png");//图片保存在Debug的上级目录的名为pixmap.png的文件中
}
注意点
1.重写绘图事件:如果在窗口绘图必须放在绘图事件里实现
2.绘图事件内部自动调用—窗口需要重绘的时候(状态改变)
3.准备步骤基本为:创建画家、确定绘图设备、画笔、画刷。
4.pixmap.save("…/pixmap.png");//图片保存在Debug上级目录的名为pixmap.png的文件中,如果没有…/就是在debug文件里
子类QBitmap
QBitmap与QPixmap不同:QBitmap类提供了单色(1位深度)像素映射。
QBitmap类是一个单色的画图设备,主要用于创建自定义QCursor和QBrush对象,构造QRegion对象,以及设置位图和小部件的遮罩。因此内存相比于原来要小得多,用法基本与QPixmap同
Widget.h和上同
在以窗口为绘图设备的基础上
--------------------------Widget.cpp--------------------------
--------------------------------------------------------------
void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
//QPixmap图片
QPixmap pixmap;
pixmap.load("../Image/2333.jpg");//加载图片
p.drawPixmap(0,200,50,50,pixmap);
//QBitmap图片背景白色
QBitmap bitmap;
bitmap.load("../Image/666.jpg");
p.drawPixmap(200,200,50,50,bitmap);
}
对比就能看出差别
QImage
和平台无关(和平台的适应性降低),可以对图片进行修改,在线程中绘图
用法
仍是在QWidget的构造函数
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//透明背景
QImage image(400,300,QImage::Format_ARGB32);
QPainter p;
p.begin(&image);//将image设为绘图设备
//绘图,线程绘图,对像素点进行操作
p.drawImage(0,0,QImage("../Image/2333.jpg"));
//对绘图设备50*50像素点进行操作
for(int i= 0;i<50;i++)
{
for(int j= 0;j<50;j++)
{
image.setPixel(i,j,qRgb(0,255,255));//rgb值设置颜色
image.pixel(QPoint(i,j));
}
}//让它们变蓝
p.end();
image.save("../iamge.png");//保存到上一级路径
}
QImage与QPixmap转换
void Widget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
//Pixmap和Image转换
QPixmap pixmap;
pixmap.load("../Image/2333.jpg");
//QPixmap->QImage
QImage tempImage=pixmap.toImage();
p.drawImage(0,0,tempImage);
//QImage->QPixmap
QImage image;
image.load("../Image/2333.jpg");
QPixmap tempPixmap=QPixmap::fromImage(image);
p.drawPixmap(100,0,100,100,tempPixmap);
}
要注意两个转换有点不同
QPicture
保存绘图的状态(二进制文件),适合跨平台使用
用法
仍是在QWidget的构造函数
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QPicture pic;
QPainter p;
p.begin(&pic);
p.drawPixmap(0,0,80,80,QPixmap("../me/t01dde92c7fb6aa61f2.jpg"));
p.drawLine(50,50,150,50);
p.end();
pic.save("../picture.png");//保存为二进制文件
}
想用窗口为绘图设备
就必须重写绘图事件
--------------------------Widget.cpp--------------------------
--------------------------------------------------------------
void Widget::paintEvent(QPaintEvent *event)
{
QPicture picture;
picture.load("../picture.png");//加载文件
QPainter p(this);
p.drawPicture(0,0,picture);//读取二进制文件
p.end();
}
可以看出三者使用起来差别并不是特别大,各有各的优点
常用共同函数:
1.为设备添加图片
load
load(const QString &fileName, const char *format = nullptr)
2.保存
save
save(const QString &fileName, const char *format = nullptr)1
此处只列出了三者通用的使用方法 ↩︎