猿问

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_())


千巷猫影
浏览 164回答 1
1回答

慕妹3242003

如果要绘制 n 矩形,则必须通过 QRect 将该信息保存在列表中。另一方面,选择 2 个点并不意味着 QRect 是有效的,例如,如果第一个点在右侧,则第二个点将不会创建有效的矩形,因此必须对矩形进行归一化。考虑到上述情况,解决方案是:import sysfrom PyQt5.QtCore import Qt, QPoint, QRectfrom PyQt5.QtGui import QPainter, QPen, QBrush, QIconfrom PyQt5.QtWidgets import QApplication, QWidgetclass 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_())
随时随地看视频慕课网APP

相关分类

Python
我要回答