当发生以下情况时会产生绘制事件并调用paintEvent()函数:
- 在窗口部件第一次显示时,系统会自动产生一个绘图事件,从而强制绘制这个窗口部件。
- 当重新调整窗口部件的大小时,系统也会产生一个绘制事件。
- 当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件。
同时可以调用QWidget::update()或者QWidget::repaint()来强制产生一个绘制事件。
二者的区别是:
- repaint()函数会强制产生一个即时的重绘事件
- update()函数只是在Qt下一次处理事件时才调用一次绘制事件。如果多次调用update(), Qt会把连续多次的绘制事件压缩成一个单一的绘制事件,这样可避免闪烁现象。
void Widget::paintEvent(QPaintEvent *event){// 创建画家QPainter painter(this);// 设置画笔颜色QPen penBlue(QColor(0,0,255));// 设置画笔宽度penBlue.setWidth(3);// 设置画笔风格penBlue.setStyle(Qt::DotLine);// 设置画家的笔painter.setPen(penBlue);// 画刷填充颜色QBrush brush(Qt::cyan);// 设置画刷风格brush.setStyle(Qt::Dense3Pattern);// 让画家使用画刷painter.setBrush(brush); // 会自动给封装图形上色// 画线painter.drawLine(QPoint(0,0),QPoint(100,100));// 画圆painter.drawEllipse(QPoint(100,100),50,50);// 画矩形painter.drawRect(QRect(10,10,50,50));// 画字体painter.drawText(QRect(20,200,100,50),QString("good good study, day day up"));}
高级设置
void Widget::paintEvent(QPaintEvent *event){// 创建画家QPainter painter(this);// 高级设置//painter.drawEllipse(QPoint(100,100),50,50);//// 设置抗锯齿//painter.setRenderHint(QPainter::Antialiasing);//painter.drawEllipse(QPoint(200,100),50,50);painter.drawRect(QRect(20,20,50,50));// 移动画家painter.translate(QPoint(100,0));// 保存状态painter.save();painter.drawRect(QRect(20,20,50,50));// 移动画家painter.translate(QPoint(100,0));// 取出状态painter.restore();painter.drawRect(QRect(20,20,50,50));}
画图片
#include "widget.h"#include "ui_widget.h"#include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);// 点击移动按钮移动图片pos = 10;connect(ui->pushButton,&QPushButton::clicked,[=](){pos += 20;update(); // 更新绘图事件});}Widget::~Widget(){delete ui;}void Widget::paintEvent(QPaintEvent *event){// 创建画家QPainter painter(this);// 超出范围则恢复if(pos > width()) pos = 10;// 画图片painter.drawPixmap(pos,100,QPixmap(":/pic/Image/001.png"));}
