如何在PySide2中使用QLabel加载图像

3
我是一名编码和Python的初学者。我了解到如果你想开发一个稍微复杂一些的应用程序,tkinter有点“基础”,而PyQt在许可方面存在问题。这就是为什么我选择使用PySide2来开发这种类型的项目,但我发现文档相对较少。这是正确的选择吗?
我的目前编码问题是:我尝试使用PySide2加载图像,但没有成功。以下是我两次尝试的代码: 尝试1:
import sys
import PySide2
from PySide2.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
img = PySide2.QtGui.QImage("/Users/mymac/Downloads/ecg_measure.png")
pixmap=PySide2.QtGui.QPixmap(img)
label = PySide2.QtWidgets.QLabel.setPixmap(pixmap)
label.show()
app.exec_()

我收到了以下信息:
Traceback (most recent call last):

File "<ipython-input-1-86961df4959d>", line 8, in <module>
label = PySide2.QtWidgets.QLabel.setPixmap(pixmap)

TypeError: descriptor 'setPixmap' requires a 'PySide2.QtWidgets.QLabel' object but received a 'PySide2.QtGui.QPixmap'

根据Traceback信息,我尝试了下面的第二次尝试:

import sys
import PySide2
from PySide2.QtWidgets import QApplication, QLabel

app = QApplication(sys.argv)
img = PySide2.QtGui.QImage("/Users/mymac/Downloads/ecg_measure.png")
pixmap=PySide2.QtGui.QPixmap(img)
lab=PySide2.QtWidgets.QLabel(pixmap)
PySide2.QtWidgets.QLabel.setPixmap(lab)
app.exec_()

I get the following errror message:

Traceback (most recent call last):

File "<ipython-input-1-61b41e4b2f63>", line 8, in <module>
lab=PySide2.QtWidgets.QLabel(pixmap)

TypeError: 'PySide2.QtWidgets.QLabel' called with wrong argument types:
PySide2.QtWidgets.QLabel(PySide2.QtGui.QPixmap) Supported signatures:
PySide2.QtWidgets.QLabel(PySide2.QtWidgets.QWidget = None, 
PySide2.QtCore.Qt.WindowFlags = Qt.WindowFlags())
PySide2.QtWidgets.QLabel(unicode, PySide2.QtWidgets.QWidget = None, PySide2.QtCore.Qt.WindowFlags = Qt.WindowFlags())
1个回答

7

以下是您代码应该看起来的样子:

import sys
from PySide2 import QtCore, QtGui, QtWidgets

app = QtWidgets.QApplication(sys.argv)

pixmap = QtGui.QPixmap('/Users/mymac/Downloads/ecg_measure.png')
label = QtWidgets.QLabel()
label.setPixmap(pixmap)    
label.show()

app.exec_()

然而,对于您想要开发的项目,QLabel 可能不太适合。您很可能需要使用 Graphics View Framework。请参考这个图像查看器示例,它提供了基本的平移和缩放功能。该示例使用 PyQt5 编写,但是您可以轻松将其转换为 PySide2——只需在文件顶部的导入中替换 PyQt5PySide2,并在第4行上用 Signal 替换 pyqtSignal 即可。此示例还需要一个名为 "image.jpg" 的图像文件位于当前目录中(或者您可以在 loadImage 方法中编辑默认路径)。
如果您没有使用 PySide/PyQt 的经验,我建议您通过这个教程来学习。它是为 PyQt5 编写的,但是代码对于 PySide2 来说将会有99%的相似度。如上所述,您通常只需要更改导入并删除一些 API 的 pyqt 前缀,例如 pyqtSignalpyqtSlot。完整的 PySide2 文档可以在这里找到,完整的 Qt 文档在这里

非常感谢@ekhumoro提供了详细和精确的答案以及许多有用的资源!与此同时,我已经成功在Qlabel中加载了一张图像,但是在将Qlabel与主窗口集成时遇到了困难。我将阅读这些资源!再次感谢。 - ecjb
如果我可以问一下@ekhumoro,当我用鼠标放大图像时,图像本身被放大,但是当我点击鼠标以获取坐标(我猜测是mousePressEvent方法),我得到的坐标好像图像没有被放大或者说缩放只对图像而不是鼠标事件生效?你在运行应用程序时遇到过这种情况吗?如果你想让我问另一个问题,我可以。如果你没有时间,我完全理解。 - ecjb
@ecjb。这只是一个非常基本的示例,它仅获取相对于视口的鼠标位置 - 它根本不考虑图像本身。 - ekhumoro
@ecjb。PS:有像mapToScenemapFromScene这样的方法,可以在视口坐标和场景坐标之间进行转换。 - ekhumoro
我必须说,我已经尝试了一个星期了。我将行self.photoClicked.emit(QtCore.QPoint(event.pos()))更改为self.photoClicked.emit(QtWidgets.QGraphicsView.mapToScene(QtCore.QPoint(event.pos()))),但是我得到了TypeError: descriptor 'mapToScene' requires a 'PySide2.QtWidgets.QGraphicsView' object but received a 'PySide2.QtCore.QPoint'。你有什么想法可以指导我吗?(如果需要,我可以提出新问题) - ecjb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接