python - PyQt5:使用事件绘制多个矩形
问题描述
我正在使用 PyQt5 创建一个桌面应用程序,用户可以在其中绘制矩形。
用户应该能够通过第一次鼠标单击选择矩形的左上角,通过第二次鼠标单击选择右下角。该位置应出现一个矩形,其周长已明确。我创建了应用程序,但是当我绘制另一个矩形时出现问题,前一个矩形消失了。我无法绘制多个矩形。
请找到以下代码以供参考
import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5.QtGui import QPainter, QPen, QBrush
from PyQt5.QtCore import Qt
class Windo(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(150,250,500,500)
self.setWindowTitle("Ammyyy")
self.setWindowIcon(QtGui.QIcon('a.jpeg'))
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
self.show()
def paintEvent(self,event):
qp = QPainter(self)
qp.begin(self)
qp.setPen(QPen(Qt.black, 6, Qt.SolidLine))
qp.drawRect(QtCore.QRect(self.begin, self.end))
qp.end()
def mousePressEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
def mouseReleaseEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
app = QApplication(sys.argv)
win = Windo()
sys.exit(app.exec_())
解决方案
如果要绘制 n 矩形,则必须通过 QRect 将该信息保存在列表中。另一方面,选择 2 个点并不意味着 QRect 是有效的,例如,如果第一个点在右侧,则第二个点不会创建有效的矩形,因此必须对矩形进行归一化。考虑到上述情况,解决方案是:
import sys
from PyQt5.QtCore import Qt, QPoint, QRect
from PyQt5.QtGui import QPainter, QPen, QBrush, QIcon
from PyQt5.QtWidgets import QApplication, QWidget
class Window(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(150, 250, 500, 500)
self.setWindowTitle("Ammyyy")
self.setWindowIcon(QIcon("a.jpeg"))
self.begin = QPoint()
self.end = QPoint()
self.rectangles = []
def paintEvent(self, event):
qp = QPainter(self)
qp.setPen(QPen(Qt.black, 6, Qt.SolidLine))
for rectangle in self.rectangles:
qp.drawRect(rectangle)
if not self.begin.isNull() and not self.end.isNull():
qp.drawRect(QRect(self.begin, self.end).normalized())
def mousePressEvent(self, event):
self.begin = self.end = event.pos()
self.update()
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
super().mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
r = QRect(self.begin, self.end).normalized()
self.rectangles.append(r)
self.begin = self.end = QPoint()
self.update()
super().mouseReleaseEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
推荐阅读
- javascript - 使用 array.reduce 将字符串分解为具有条件的数组
- google-cloud-platform - 如何在没有 CLI 的情况下使用控制台设置和使用 Cloud Storage 的 Pub/Sub 通知?
- java - 在tomcat的java方法中查找分配的内存
- r - pivot_wider 按出现次数动态变化
- r - regsubsets 正在从因子水平生成虚拟变量 - 我们可以让它不这样做吗?
- spring-boot - 如何评估在应用程序中是使用spring batch还是scheduler?
- python - 如何安排函数在 discord.py 中的特定时间每天运行?
- c# - PostSharp MulticastAttributeUsage 不起作用
- mongodb - 在 SpEL Bean 参考的集成测试期间注册 Mock Bean
- python - 在这里使用嵌套的 try-except 可接受的 Python 样式