Qt | 关于重绘事件处理函数 paintEvent()

3,300 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言:

QWidget提供的paintEvent()函数是一个纯虚函数,继承它的子类想进行重绘时必须重新实现这个函数。

引发重绘事件的情况:

  1. 当窗口控件第一次显示时,系统会自动产生一个绘图事件。
  2. repaint()与update()函数被调用时。
  3. 当窗口控件被其他部件遮挡,然后又显示出来时,会对隐藏的区域产生一个重绘事件。
  4. 重新调整窗口大小时。

paintEvent()函数是已经被高度优化过的函数,本身已经自动开启并实现了双缓冲机制,因此在Qt中重绘操作不会引起屏幕上的任何闪烁现象。

repaint()函数:

  • repaint()是最快引起重绘操作的,紧急情况下需要立刻重绘的时候可以调用repaint()。
  • 但是repaint()不能放到paintEvent()函数里面调用,或造成死循环。

update()函数:

  • update()调用之后不会立即重绘,而是将重绘事件放入主循环中,由main()主函数的事件循环(Event Loop)统一调度。
  • update()在调用paintEvent()之前做了优化,如果update()被调用了很多次,最后这些update()会合并到一个大的重绘事件,并加入到消息队列,最后只有这个大的update()被执行一次

repaint()和update()相比,一般情况下调用update()就够了,当update()不能满足需求时,再尝试使用repaint()。

在paintEvent()中实现绘图操作:

绘图常用的工具有画笔类QPen、画刷类QBrush和字体类QFont等,它们都继承自QPainter类。

  • QPainter可以绘制各种基础图形。
  • QPen类用于绘制几何图形的边缘,由颜色、宽度、线条风格等参数组成。
  • QBrush类是用于填充几何图形的调色板,由颜色和填充风格组成。
  • QFont类用于文本绘制,由字体属性组成。

例:

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawLine(10, 100, 30, 300);//画线
    painter.setPen(Qt::red);
    painter.drawRect(10, 10, 100, 100);//红色矩形框
    painter.setPen(QPen(Qt::green, 5));
    painter.setBrush(Qt::blue);
    painter.drawEllipse(100, 10, 200, 200);//绿边蓝色填充椭圆
}

其他具体用法还可以参考帮助手册查看。