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