首页 > 解决方案 > 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_())

标签: pythonpyqtpyqt5

解决方案


如果要绘制 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_())

推荐阅读