如何正确设置在 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 上绘制圆圈