Qt什么时候触发paintEvent事件
paintEvent事件可以在以下几种情况下被触发:
- 窗口初始化和显示:当窗口首次被创建、显示,或者窗口被覆盖、最小化后再恢复时,paintEvent会被触发以绘制窗口的内容。
- 部件大小或位置变化:如果窗口或部件的大小或位置发生变化,需要重新绘制内容以适应新的尺寸或位置,此时也会触发paintEvent。
- 强制重绘:当调用部件的update()或repaint()函数时,会触发对应部件的paintEvent,强制要求重新绘制。
- 系统事件触发:一些系统事件(比如窗口激活、失去焦点等)可能导致部件的内容需要重新绘制,这时候也会触发paintEvent。
- 当窗口部件被其他窗口部件遮挡,然后又再次显示出来的时候,就会对那些隐藏的区域产生一个绘制事件。
当任何导致窗口或部件需要重新绘制的事件发生时,Qt会发送paintEvent给对应的部件,以便程序员可以重写该事件的处理函数来执行所需的绘制操作。
需要注意的是,对于特定的部件,例如继承自 QWidget 的自定义部件,可以重写其 paintEvent 函数来自定义绘制逻辑.
如下是一个paintEvent事件例子:
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event)
// this是指定给图的对象
QPainter painter(this);
// 设置抗锯齿
painter.setRenderHint(QPainter::Antialiasing);
//设置画笔
QPen pen;
pen.setWidth(5);
//pen.setColor(QColor("#888888"));
pen.setColor(QColor(200, 100, 50));
QBrush brush(QColor(200, 100, 50));
///* brush.setColor(QColor(200, 100, 50));*/
// 将画刷给画家
// painter.setBrush(brush);
// 将画笔给画家
painter.setPen(pen);
// 画矩形
painter.drawRect(200, 100, 100, 100);
// 多边形
QPolygon polygon;
polygon.setPoints(3, 100, 20, 200, 50, 300, 300);
// 画三角形
painter.drawPolygon(polygon);
// 画直线
painter.drawLine(400, 400, 500, 500);
// 画椭圆
painter.drawEllipse(200, 200, 50, 100);
// 画文字
QRectF rectF(0, 0, 200, 100);
painter.drawText(rectF, Qt::AlignHCenter, "hello world");
// 画路径
QPainterPath path;
path.moveTo(20, 80);
path.lineTo(20, 30);
path.cubicTo(80, 0, 50, 50, 80, 80);
painter.drawPath(path);
}