【问题标题】:PyQt5: drawing multiple rectangles using eventsPyQt5:使用事件绘制多个矩形
【发布时间】:2020-02-04 08:30:09
【问题描述】:

我正在使用 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_())

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多