gpt4 book ai didi

python - 在 PyQt5 中使用双缓冲技术绘制矩形时出现重影图像

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:33 25 4
gpt4 key购买 nike

这是我的代码:

import sys
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QPainter, QPixmap
from PyQt5.QtWidgets import QApplication, QWidget


class Demo(QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(600, 600)

self.pix = QPixmap(600, 600)
self.pix.fill(Qt.white)

self.begin_point = QPoint()
self.end_point = QPoint()

def paintEvent(self, QPaintEvent):
painter = QPainter(self)

x = self.begin_point.x()
y = self.begin_point.y()
w = self.end_point.x()-x
h = self.end_point.y()-y
painter2 = QPainter(self.pix) # paint on a QPixmap first
painter2.drawRect(x, y, w, h)
painter.drawPixmap(0, 0, self.pix) # then pain on the widget

def mousePressEvent(self, QMouseEvent):
if QMouseEvent.button() == Qt.LeftButton:
self.begin_point = QMouseEvent.pos()
self.end_point = self.begin_point

def mouseMoveEvent(self, QMouseEvent):
if QMouseEvent.buttons() == Qt.LeftButton:
self.end_point = QMouseEvent.pos()
self.update()


if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())

我移动得越慢,我得到的 rect 的幻影就越多(左边一个是较慢的)。

enter image description here

首先,我希望我的代码能够正确理解双缓冲技术。不对请指出。

我知道是paintEvent()调用次数太多造成的。我想知道如何在不删除 mouseMoveEvent() 的情况下使其正确,因为我希望用户在绘制时始终看到矩形。

最佳答案

在这些情况下,有两种类型的数据存储不同类型的信息:永久信息和临时信息。永久的必须是松开鼠标后的矩形,保存在QPixmap中,临时的必须是边拖鼠标边绘制。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Demo(QtWidgets.QWidget):
def __init__(self):
super(Demo, self).__init__()
self.resize(600, 600)

self.pix = QtGui.QPixmap(600, 600)
self.pix.fill(QtCore.Qt.white)
self.begin_point, self.end_point = QtCore.QPoint(), QtCore.QPoint()

def paintEvent(self, QPaintEvent):
painter = QtGui.QPainter(self)
painter.drawPixmap(QtCore.QPoint(), self.pix)

if not self.begin_point.isNull() and not self.end_point.isNull():
r = QtCore.QRect(self.begin_point, self.end_point)
painter.drawRect(r.normalized())

def mousePressEvent(self, event):
if event.button() & QtCore.Qt.LeftButton:
self.begin_point = event.pos()
self.end_point = self.begin_point
self.update()

def mouseMoveEvent(self, event):
if event.buttons() & QtCore.Qt.LeftButton:
self.end_point = event.pos()
self.update()

def mouseReleaseEvent(self, event):
if event.button() & QtCore.Qt.LeftButton:
r = QtCore.QRect(self.begin_point, self.end_point)
painter = QtGui.QPainter(self.pix)
painter.drawRect(r.normalized())
self.begin_point = self.end_point = QtCore.QPoint()
self.update()

if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())

enter image description here

关于python - 在 PyQt5 中使用双缓冲技术绘制矩形时出现重影图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53745683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com