如何正确设置在 PyQt5 上缩放的 Pixmap?

Posted

技术标签:

【中文标题】如何正确设置在 PyQt5 上缩放的 Pixmap?【英文标题】:How to properly setPixmap scaled on PyQt5? 【发布时间】:2017-07-10 18:06:33 【问题描述】:

我是 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

【问题讨论】:

你为什么使用 PIL? 你的问题是什么?,你想得到什么? PIL 不是必需的。我可以改变我在哪里使用 PIL 作为 pixmap_image = QtGui.QPixmap("Images/Quart_top_View_draw.jpg") 行。我需要的是画出我的指针所在的圆圈。 我猜体育场的形象是QLabel,对吗? 是的,你是对的。当我移动鼠标时,我得到了他在 QLabel 上的位置。然后我在图像上画了一个圆圈,使用我从鼠标跟踪中获得的像素,但它不匹配(指针位置与图像上的圆圈不同)。当我最大化 UI 时,差异变得更大。我想这是规模问题,但我不知道如何解决。 【参考方案1】:

您可以创建一个自定义小部件来执行此任务,而不是使用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_())

截图:

【讨论】:

嗨 eyllanesc。你的回答效果很好。我在我的主窗口中添加了 QWidget。非常感谢。 你好@eyllanesc。可以保持图像大小比例吗?如果是,你能帮帮我吗? 如果标签的关系与您要显示的图像不匹配? 例如,如果我现在调整主窗口的大小,我的图像就会跟随它。我的目标是如果图像是 400x400 的正方形,并且我只增加主窗口的垂直尺寸,图像不能改变,因为必须保持纵横比。 我不懂你,你自己解释清楚

以上是关于如何正确设置在 PyQt5 上缩放的 Pixmap?的主要内容,如果未能解决你的问题,请参考以下文章

使用 QPainter 和 paintEvent 在 PYQT5 中的 QLabel 中包含的 Pixmap 上绘制圆圈

PyQt5 Pixmap 来自内置游标

PyQt5:QScrollArea 保持 Pixmap 纵横比

如何使小部件随 PyQt5 中的窗口缩放?

如何使用 pixmap 和 Qlabel 使图像可选择?

如何在 libgdx 中正确设置 FrameBuffer 的宽度和高度?