PyQt5: рисование нескольких прямоугольников с использованием событий - PullRequest
2 голосов
/ 04 февраля 2020

Я создаю настольное приложение с использованием 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_())

1 Ответ

3 голосов
/ 04 февраля 2020

Если вы хотите нарисовать 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...