Изображение не отображается при попытке нарисовать прямоугольник над PyQt QLabel - PullRequest
0 голосов
/ 29 февраля 2020

Изображение не отображается при попытке нарисовать прямоугольник поверх QLabel изображения. Я хочу, чтобы можно было нарисовать прямоугольник над фотографией и сохранить его / скрыть. Вот что я попробовал после проверки предложений:

from PyQt5.QtGui import QPixmap, QImage, QPainter, QBrush, QColor
from PyQt5.QtWidgets import QMainWindow, QApplication, QDesktopWidget, QVBoxLayout, QWidget, QLabel
from PyQt5.QtCore import QPoint, QRect
import sys
import cv2


class TestRect(QLabel):
    def __init__(self):
        super().__init__()
        self.begin = QPoint()
        self.end = QPoint()

    def paintEvent(self, event):
        qp = QPainter(self)
        br = QBrush(QColor(100, 10, 10, 40))
        qp.setBrush(br)
        qp.drawRect(QRect(self.begin, self.end))

    def mousePressEvent(self, event):
        self.begin = event.pos()
        self.end = event.pos()
        self.update()

    def mouseMoveEvent(self, event):
        self.end = event.pos()
        self.update()

    def mouseReleaseEvent(self, event):
        self.begin = event.pos()
        self.end = event.pos()
        self.update()


class TestWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.current_image = None
        win_rectangle = self.frameGeometry()
        center_point = QDesktopWidget().availableGeometry().center()
        win_rectangle.moveCenter(center_point)
        self.move(win_rectangle.topLeft())
        self.main_layout = QVBoxLayout()
        self.central_widget = QWidget(self)
        self.test_image()
        self.show()

    def test_image(self):
        self.central_widget.setLayout(self.main_layout)
        self.setCentralWidget(self.central_widget)
        image = TestRect()
        self.main_layout.addWidget(image)
        uploaded = cv2.imread('test.jpg')
        resized = cv2.resize(uploaded, (500, 500))
        height, width = 500, 500
        self.current_image = QImage(resized, height, width, QImage.Format_RGB888)
        image.setPixmap(QPixmap(self.current_image))


if __name__ == '__main__':
    test = QApplication(sys.argv)
    test_window = TestWindow()
    sys.exit(test.exec_())

1 Ответ

1 голос
/ 29 февраля 2020

Если вы переопределяете метод, не вызывая реализацию родителя через super, то предыдущее поведение не будет использоваться, и это то, что происходит в вашем случае: обычное поведение QLabel - рисовать, но переопределять, а не вызывать super, это был устранен. Решение:

def paintEvent(self, event):
    <b>super().paintEvent(event)</b>
    qp = QPainter(self)
    br = QBrush(QColor(100, 10, 10, 40))
    qp.setBrush(br)
    qp.drawRect(QRect(self.begin, self.end))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...