如何在 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_())
截图:
我是 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_())
截图: