0

I'm a rookie of python and I googled a lots but still can not find how to fix it. My question is how to draw rectangle on Qlabel of image with mouse moving? My code as below.

import sys
import QT5_draw_test as ui

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Main(QMainWindow, ui.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.rect_begin = QPoint()
        self.rect_end = QPoint()

        self.image_show.setScaledContents(True)
        self.image_show.installEventFilter(self)

        self.img = QPixmap("0.png")
        self.image_show.setPixmap(self.img)
    
    def eventFilter(self, obj, event):
        if event.type() == QEvent.MouseButtonPress:
            self.rect_begin = event.pos()

        elif event.type() == QEvent.MouseMove:
            self.rect_end = event.pos()
            self.update()

        return super().eventFilter(obj, event)

    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter(self.image_show.pixmap())
        painter.setPen(QPen(Qt.red, 5, Qt.SolidLine))
        
        print(self.rect_begin.x(), self.rect_begin.y(), self.rect_end.x(), self.rect_end.y())
        painter.drawRect(self.rect_begin.x(), self.rect_begin.y(), self.rect_end.x(), self.rect_end.y())


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

If modify the parameter of painter.drawRect to constant, it's work. (As below)

But If the parameter is variable, it's not work.

import sys
import QT5_draw_test as ui

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Main(QMainWindow, ui.Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.rect_begin = QPoint()
        self.rect_end = QPoint()

        self.image_show.setScaledContents(True)
        self.image_show.installEventFilter(self)

        self.img = QPixmap("0.png")
        self.image_show.setPixmap(self.img)
    
    def eventFilter(self, obj, event):
        if event.type() == QEvent.MouseButtonPress:
            self.rect_begin = event.pos()

        elif event.type() == QEvent.MouseMove:
            self.rect_end = event.pos()
            self.update()

        return super().eventFilter(obj, event)

    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter(self.image_show.pixmap())
        painter.setPen(QPen(Qt.red, 5, Qt.SolidLine))

        print(self.rect_begin.x(), self.rect_begin.y(), self.rect_end.x(), self.rect_end.y())
        painter.drawRect(50, 50, 100, 100)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

enter image description here

Charlie
  • 1
  • 1
  • You should not paint on a different object within the `paintEvent()`. Also see this [closely related post](https://stackoverflow.com/q/75115266/2001654). – musicamante Jan 14 '23 at 04:43

0 Answers0