目录
QPaintEvent绘图事件
常见事件
- 窗口第一次显示时:当窗口或控件第一次出现在屏幕上时,系统会生成一个 QPaintEvent 事件, 通知窗口进行自身的绘制。
- 窗口大小改变时:当用户改变窗口的大小时,窗口的内容通常需要重新绘制以适应新的尺寸。
- 窗口部分被遮挡后又重新显示时:如果窗口被其他窗口遮挡,然后又重新露出来,被遮挡的部分通 常需要重新绘制。
- 手动请求重绘:通过调用 QWidget 的 update() 或 repaint() 方法,可以手动触发重绘事件。
触发事件便会执行paintEvent(QPaintEvent *),我们可以重写QWidget 的 paintEvent(QPaintEvent *) 方法来处理绘制逻辑
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
//上面事件就会触发这个函数
}
QPainter
QPainter 是 Qt 库中用于在屏幕上进行绘画的类。它提供了各种绘制功能,比如画线、画图形、画文本等
初始化 QPainter
想要绘画就要有纸才能画,纸可以是一个窗口QWidget或一个照片QPixmap
QPainter painter(this);
//this便指的是纸
设置画笔和画刷
设置描边或者填充色块
painter.setPen(Qt::blue); // 设置画笔颜色为蓝色
painter.setBrush(Qt::yellow); // 设置画刷颜色为黄色
绘制图形
设置字体、绘制线条、矩形、圆形、文本等,窗口的左上角是x和y的0点,往右x增大,往下y增大
painter.drawLine(10, 10, 100, 100); // 画线
painter.drawRect(10, 10, 100, 100); // 画矩形
painter.setFont(QFont("Arial",30)); // 设置字体
painter.drawText(10, 10, "Hello"); // 指定位置画文本
painter.drawText(rect(), Qt::AlignCenter, "Hello"); // 窗口中间画文本
如果你想一开始就在窗口画,就在触发的事件函数里画widget::paintEvent(QPaintEvent *event)
结束绘制
完成绘制后, QPainter 对象会在其析构函数中自动结束绘制
画线
painter.drawLine(10, 10, 100, 100);
painter.drawLine(QLine(10, 10, 100, 100));
painter.drawLine(QPoint(10, 10), QPoint(100, 100));
画矩形
QRect rec(20,100,220,200);
painter.drawRect(rec);
painter.drawRect(20,100,220,200);
画圆形
QRect rec(20,100,220,200);
painter.drawEllipse(rec);//在长方形内画椭圆
painter.drawEllipse(rect(),center(),200,100);//在窗口中间画椭圆
painter.drawEllipse(QPoint(60,500),20,20);//在窗口中间画椭圆
画弧线
正角度为逆时针,负角度为顺时针,从中间点的右边的为0°起始度
painter.drawArc(rec,30*16,120*16);//在矩形中画°弧线
painter.drawArc(30,100,200,360,30*16,120*16);//在矩形中画弧线
画扇形
painter.drawArc(30,100,200,360,30*16,120*16);//在矩形中画扇形
指定画笔大小 QPen
QPen pen(Qt::blue,8);//初始化画笔
pointer.setPen(pen);//使用画笔
抗锯齿
painter.setRenderHint(QPainter::Antialiasing,true);//开启抗锯齿
无边框
painter.setPen(Qt::NoPen);
画指针 多边形
painter.setBrush(Qt::white);//白色笔刷
painter.setPen(Qt::NoPen);//不使用任何画笔
//制定多边形
static const QPointF points[4] = {
QPointF(0,0.0),
QPointF(200.0,-1.1),
QPointF(200.0,1.1),
QPointF(0,15.0),
};
//画一个多边形
//一个 QPolygonF 对象,它包含了多边形的顶点坐标 顶点数量
painter.drawPolygon(points, 4);
渐变色 QLinearGradient
使用步骤
- 创建 QLinearGradient 对象:指定渐变的起点和终点坐标
- 设置颜色停靠点:在渐变线上定义颜色和相应的位置
- 使用渐变创建 QBrush :用 QLinearGradient 对象来创建一个 QBrush ,然后用它在 QPainter 中进行绘制
示例一 线性渐变
//定义画刷
QPainter painter(this);
//定义渐变色 起始到终点
QLinearGradient lineGradient(width()/2,0,width()/2,height());
//从0-1之间制定颜色
lineGradient.setColorAt(0.1,QColor(0,0,0,255));
lineGradient.setColorAt(0.3,QColor(0,0,0,180));
lineGradient.setColorAt(0.5,QColor(0,0,0,100));
lineGradient.setColorAt(1,Qt::white);
//将渐变色应用到画刷上
QBrush brush(lineGradient);
//使用画刷
painter.setBrush(brush);
//画矩形
painter.drawRect(rect());
示例二 径向渐变
//定义绘图对象
QPainter painter(this);
//抗锯齿
painter.setRenderHint(QPainter::Antialiasing,true);
//定义渐变色 窗体中间 范围200
QRadialGradient radialGradient(width()/2,height()/2,20);
//红到黄
radialGradient.setColorAt(0.1, Qt::red);
radialGradient.setColorAt(1, Qt::yellow);
//将渐变色设置给绘图对象
painter.setBrush(QBrush(radialGradient));
//无边框
painter.setPen(Qt::NoPen);
//画矩形
painter.drawRect(150,250,400,200);
示例三 圆锥形渐变
// 创建一个 QConicalGradient 对象
QConicalGradient conicalGradient(100, 100, 0); // 中心点 (100, 100),起始角度 0
// 添加颜色停靠点
conicalGradient.setColorAt(0.0, Qt::red);
conicalGradient.setColorAt(0.5, Qt::blue);
conicalGradient.setColorAt(1.0, Qt::red);
// 使用这个渐变创建 QBrush
QBrush brush(conicalGradient);
// 使用 QBrush 进行绘图
QPainter painter(this);
painter.setBrush(brush);
painter.setPen(Qt::NoPen); // 无边框
painter.drawRect(this->rect()); // 绘制扇形覆盖整个小部件
保存当前坐标轴
painter.save();//保存当前的坐标轴
painter.restore();//坐标轴回到保存的坐标轴
旋转坐标轴
painter.rotate(90);//顺时针旋转90°
画一个图片
QRect rectangle(-65,radius*0.38,130,50);//画一个矩形
painter.drawPixmap(rectangle,QPixmap(":/icon.png"));//在矩形里加载图片