如何在pyqt5中QLabel上的图像上绘制矩形

问题描述 投票:0回答:1

我实际上正在使用 pyqt5 设计一个应用程序。在应用程序的一个屏幕中,我在 QLabel 上显示图像。我想在图像上画一个矩形。所以我使用鼠标按下和释放事件来获取图像上的鼠标按下和释放值。我正在使用 QPainter.drawRect( x, y, widht, height) 来绘制矩形。但问题是,当我打印它们时,我得到了正确的鼠标按下和释放值,但是矩形是相对于主窗口绘制的。

我的Windows层次结构如下: QMainWindow -> QWidget -> QWidget -> QLabel ->image

我使用了mapToGlobal、mapFromRect、mapFromGobal,我在全局范围内获得了正确的按下和释放值(相对于QMainWindow)以及QLabel。但我传递这些值来绘制它在其他地方绘制的矩形。

下面是部分代码

    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QtGui.QPainter(self.demo_room_image)
        pen = QtGui.QPen(Qt.red)
        pen.setWidth(20)    
        painter.setPen(pen)
        painter.drawRect(self.a , self.b , self.c - self.a, self.d - self.b)            
        painter.end()
    
        self.image = QPixmap(self.demo_room_image).scaled(self.picBox.width() - 15,
                                                     self.picBox.height() - 15,
                                                     aspectRatioMode=QtCore.Qt.KeepAspectRatio,
                                                     transformMode=QtCore.Qt.SmoothTransformation)

        self.picBox_2.setPixmap(self.image)  
 #picBox_2 is my QLabel


    def mousePressEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            # Get the mouse press position on the image relative to the main window
            global_pos = self.mapToGlobal(event.pos()) 
            self.a = global_pos.x()
            self.b = global_pos.y()
            image_pos = self.mapFromGlobal(global_pos)  
            self.x1 = image_pos.x()
            self.y1 = image_pos.y()

            self.update()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            # Get the mouse release position on the image relative to the main window
            global_pos = self.mapToGlobal(event.pos())
            self.c = global_pos.x()# Convert to global coordinates
            self.d =  global_pos.y()  
            image_pos = self.mapFromGlobal(global_pos)  
            self.x2 = image_pos.x()
            self.y2 = image_pos.y()
            self.update()

python pyqt pyqt5
1个回答
0
投票

更新:我明白了。我需要使用从 QLabel 到全局事件位置的 mapTo 函数(even.pos())。在绘制矩形时,我需要减去 QMainwindow 和 QLabel 之间的偏移量(x,y)

© www.soinside.com 2019 - 2024. All rights reserved.