Qt
大约 3 分钟
Qt
目录
绘图事件 && 画家类
绘画类
QPainter 画家类
头文件
#include <QPainter>
,画家类
原型声明
void paintEvent(QPaintEvent *);
,绘画事件
高级设置
使用
void Widget::paintEvent(QPaintEvent) // 绘图事件,会被自动调用,本来是个空实现 { QPainter painter(this); painter.drawEllipse(QPoint(100,50),50,50); painter.setRenderHint(QPainter::Antialiasing); // 设置画家抗锯齿(其他媒体值查文档) painter.drawEllipse(QPoint(200,50),50,50); painter.drawRect(QRect(20,20,50,50)); painter.translate(100,0); // 设置移动画家 painter.save(); // 保存画家状态 painter.drawRect(QRect(20,20,50,50)); painter.translate(100,0); painter.restore(); // 还原画家状态 painter.drawRect(QRect(20,20,50,50)); }
QPen 画笔类
QBrush 笔刷类
QPaintEvent 绘画事件类
手动调用绘画事件
注意点
- 不要直接调用
paintEvent()
,而用另外的两个函数取间接调用
- 不要直接调用
使用示例(点击按钮移动图片示例)
构造函数{ connect(ui->pushButton, &QPushButton::Clicked, [=](){ posX+=20; // 每次图片移动20px update(); // 而不要直接去调用 paintEvent() }); } void Widget::paintEvent(QPaintEvent) { QPainter painter(this); painter.drawPixmap(posX,100,QPixmap(":/Image/Luffy.png")); }
综合使用
使用
void Widget::paintEvent(QPaintEvent) // 绘图事件,会被自动调用,本来是个空实现 { // 初始化画家 QPainter painter(this); // 实例化画家对象,this指定绘图的设备 // 设置画笔,并让画家使用画笔(只勾线) QPen pen(QColor(255,0,0)); // 设置画笔颜色(也可以使用媒体值指定颜色,如Qt::cyan) pen.setWidth(3); // 设置画笔宽度 pen.setStyle(Qt::DotLine); // 设置画笔风格 - 虚线(其他媒体值查文档) painter.setPen(pen); // 让画家使用该画笔 // 设置画刷,并让画家使用画刷(绘制封闭图形时进行填充) QBrush brush(QColor(0,255,0)); // 设置画刷颜色(也可以使用媒体值指定颜色,如Qt::cyan) brush.setStyle(Qt::Dense7Pattern); // 设置画刷风格 painter.setBrush(brush); // 让画家使用该画刷 // 画家的绘制方法 painter.drawLine(QPoint(0,0), QPoint(100,100)); // 绘制曲线 painter.drawEllipse(QPoint(100,100),50,50); // 绘制椭圆/圆 painter.drawRect(QRect(20,20,50,50)); // 绘制矩形 painter.drawText(QRect(10,200,100,50), "Hello"); // 绘制文字 QImage img; img.load(":/Image/Luffy.png"); painter.drawImage(0,0,img); // 按图片绘制 QPicture pic; pic.load("E:\\pic.zt"); painter.drawPicture(0,0,pic); // 按动作绘制 }
绘图设备类
- 简概
- 绘图设备是指继承
QPainterDevice
的子类 - 补充:
QWidget
有两个基类:QObject
和QPaintDevice
,后者是绘图设备,所以可以在窗口上绘图
- 绘图设备是指继承
- 分类:Qt一共提供了四个这样的类
QPixmap
- 说明:专门用于在屏幕上显示图像,还做了跨平台显示优化
- 头文件:
#include <QPixmap>
QBitmap
- 继承:是QPixmap的一个子类,它的色深限定为1
- 说明:可以使用QPixmap的isQBitmap()函数来确定QPixmap是不是一个QBitmap
QImage
- 说明:可以进行图像的像素级访问
QPicture
- 说明:可以记录和重现QPainter的各条命令
- 补充:gif用的
QMoive
类- 头文件:
#include <QMovie>
- 头文件:
QPixmap 位图类
使用示例(绘制图片并保存)
QPixmap pix(300,300,QImage::Format_RGB32); // QPixmap绘图设备,300x300大小,RGB32模式(可选参数) pix.fill(Qt::white); // 填充背景色(默认背景透明/为黑) QPainter painter(&pix); // 声明画家(参数为this时表示使用继承了QPainterDevice的主窗口绘画) painter.drawEllipse(QPoint(150,150),100,100); // 回家绘制椭圆 pix.save("E:\\pix.png"); // 可以画完后保存在本地
QImage 图片类
使用示例(利用QImage对像素进行修改)
QPainter painter(this); // 声明画家 QImage img; // QImage绘图设备 img.load(":/Image/Luffy.png"); // 加载图片 for(int i=50; i<100; i++) { for(int j=50; j<100; j++) { QRgb value = qRgb(255,0,0); // 像素点 img.setPixel(i,j,value); } } painter.drawImage(0,0,img)); // 画家绘制图片
QPicture 绘图指令类
使用示例(记录和重现绘图指令)
// 记录 QPicture pic; QPainter painter; painter.begin(&pic); // 开始画画(绘制在QPicture) painter.setPen(QPen(Qt::cyan)); painter.drawEllipse(QPoint(150,150),100,100); painter.end(); // 结束画画 pic.save("E:\\pic.zt"); // 保存.zt文件 // 重现 QPainter painter(this); QPicture pic; pic.load("E:\\pic.zt"); // 加载动作 painter.drawPicture(0,0,pic);