当发生以下情况时会产生绘制事件并调用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"));
}