如何在 PyQt5 上正确设置缩放的像素图?

How to properly setPixmap scaled on PyQt5?

我是 Pyqt 的新手,我正在尝试创建一个 UI 在我们给出像素位置时在图像 (QLabel) 上打印一个圆圈(使用 QPainter)。为了进行测试,我正在使用鼠标跟踪事件,但我想我在调整图像或标签大小方面遇到了问题。下面是我实现的图片:

结果:

看看指针和圆圈的位置。这就是我要解决的问题。

下面你可以看到代码(我正在使用 PIL(加载图像)和 PyQt5):

    ...     

    self.image = Image.open("Images/Quart_top_View_draw.jpg")
    self.MainWindow.TennisCourtImage.setMouseTracking(True)
    self.MainWindow.TennisCourtImage.mouseMoveEvent = self.get_mouse_pos

def get_mouse_pos(self,event):      
    x = event.pos().x()
    y = event.pos().y()
    print("Position: ", x,y)

    img = self.image
    width, height = img.size
    print("Image Size: ", width, height)

    img = ImageQt(img)
    pixmap_image = QtGui.QPixmap.fromImage(img)

    self.painterInstance = QtGui.QPainter(pixmap_image)
    self.painterInstance.setPen(QPen(Qt.red, 15, Qt.SolidLine))
    self.painterInstance.drawEllipse(x,y,15,15)
    self.painterInstance.end()

    myScaledPixmap = pixmap_image.scaled(self.MainWindow.TennisCourtImage.size(), Qt.KeepAspectRatio)
    self.MainWindow.TennisCourtImage.setPixmap(myScaledPixmap)

    ...

有人可以帮帮我吗?

此致,

加布里埃尔:D

您可以创建一个自定义小部件来执行此任务,而不是使用 QLabel,如下所示:

class Stadium(QWidget):
    def __init__(self, pixmap, parent=None):
        QWidget.__init__(self, parent=parent)
        self.pixmap = pixmap
        self.pos = None
        self.setMouseTracking(True)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), self.pixmap)
        painter.setPen(QPen(Qt.red, 15, Qt.SolidLine))
        if self.pos:
            painter.drawEllipse(self.pos, 15, 15)

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

示例:

class Widget(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent=parent)
        self.setLayout(QVBoxLayout())
        label = Stadium(QPixmap("475776182987.png"))
        self.layout().addWidget(label)
        self.resize(640, 480)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

截图: