为了账号安全,请及时绑定邮箱和手机立即绑定

PyQt5:使用事件绘制多个矩形

PyQt5:使用事件绘制多个矩形

千巷猫影 2022-07-19 15:43:01
我正在使用 PyQt5 创建一个桌面应用程序,用户可以在其中绘制矩形。用户应该能够通过第一次鼠标单击选择矩形的左上角,通过第二次鼠标单击选择右下角。该位置应出现一个矩形,其周长已明确。我创建了应用程序,但是当我绘制另一个矩形时出现问题,前一个矩形消失了。我无法绘制多个矩形。请找到以下代码以供参考import sysfrom PyQt5.QtWidgets import *from PyQt5 import QtGui, QtCorefrom PyQt5.QtGui import QPainter, QPen, QBrushfrom PyQt5.QtCore import Qtclass 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_())
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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


查看完整回答
反对 回复 2022-07-19
  • 1 回答
  • 0 关注
  • 163 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号