双缓冲技术实现实时绘图

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

 

复制代码
 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_())
复制代码

 

posted @   天子骄龙  阅读(647)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示