前言:
QWidget提供的paintEvent()函数是一个纯虚函数,继承它的子类想进行重绘时必须重新实现这个函数。
引发重绘事件的情况:
- 当窗口控件第一次显示时,系统会自动产生一个绘图事件。
- repaint()与update()函数被调用时。
- 当窗口控件被其他部件遮挡,然后又显示出来时,会对隐藏的区域产生一个重绘事件。
- 重新调整窗口大小时。
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);//绿边蓝色填充椭圆 }
其他具体用法还可以参考帮助手册查看。