所谓的双缓冲技术,简单来说就是我们先在一张画布上画好我们想要的,然后再将这张画布上的内容在控件(屏幕)上呈现出来。稍微专业点来说就是先建立一个临时缓冲区用于存储我们要画的内容,之后拷贝到图像显示缓冲区中进行显示。相比直接在控件上绘图,双缓冲技术可以有效减少绘图时所产生的闪烁问题,也可以让绘制速度变得更快

1 import sys
2 from PyQt5.QtCore import Qt, QPoint
3 from PyQt5.QtGui import QPainter, QPixmap
4 from PyQt5.QtWidgets import QApplication, QWidget
5
6
7 class Demo(QWidget):
8 def __init__(self):
9 super(Demo, self).__init__()
10 self.resize(600, 600)
11
12 self.begin_point = QPoint()
13 self.end_point = QPoint()
14
15 self.pix = QPixmap(600, 600) # 实例化一个QPixmap()图片对象作为画布
16 self.pix.fill(Qt.white) #给图片对象填充颜色
17
18 #在paintEvent()事件函数中,我们先实例化一个以self.pix为绘画设备的QPainter实例,在这个画布上先画出自己想要的图案。再实例化一个以窗口为绘画设备的QPainter实例,然后调用drawPixmap()方法将self.pix画布一次性画在窗口(屏幕)上
    #好处-在重新调用paintEvent绘图事件时,窗口原本内容被清除,而图片的内容不会被清除
19     def paintEvent(self, QPaintEvent):
20 painter = QPainter(self.pix) #实例化一个画布。用图片对象作为画布
21 painter.drawLine(self.begin_point, self.end_point)
22 self.begin_point = self.end_point
23 painter2 = QPainter(self) #实例化一个画布。用窗口作为画布
24 painter2.drawPixmap(0, 0, self.pix) #在画布上加载图片
25 #参数1 参数2 坐标
26 #参数3 图片对象
27
28 def mousePressEvent(self, QMouseEvent):
29 if QMouseEvent.button() == Qt.LeftButton:
30 self.begin_point = QMouseEvent.pos()
31 self.end_point = self.begin_point
32 self.update() #再次调用绘图事件
33
34 def mouseMoveEvent(self, QMouseEvent):
35 if QMouseEvent.buttons() == Qt.LeftButton:
36 self.end_point = QMouseEvent.pos()
37 self.update()
38
39
40 if __name__ == '__main__':
41 app = QApplication(sys.argv)
42 demo = Demo()
43 demo.show()
44 sys.exit(app.exec_())