【问题标题】:How to load an image with QLabel in PySide2如何在 PySide2 中使用 QLabel 加载图像
【发布时间】:2018-10-17 00:06:31
【问题描述】:

我是编码和 python 的初学者。我读到如果你想开发一个稍微复杂一点的应用程序,tkinter 有点“基础”,而且 PyQt 在许可方面存在问题。这就是为什么我选择 PySide2 来开发this kind of project,但发现到目前为止文档相对稀缺。这是正确的选择吗?

我目前的编码问题如下:我正在尝试使用 PySide2 加载图像但没有成功。这是我 2 次尝试的代码:

尝试 N°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 中的信息,我尝试了以下尝试 N°2:

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_()

我收到以下错误消息:

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())

【问题讨论】:

    标签: python-3.x image qlabel qpixmap pyside2


    【解决方案1】:

    你的代码应该是这样的:

    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。有关提供平移和缩放的基本演示,请参阅 this image viewer example。它是使用 PyQt5 编写的,但您可以轻松地将其转换为 PySide2 - 只需在文件顶部的导入中将 PyQt5 替换为 PySide2,并在第 4 行将 pyqtSignal 替换为 Signal。该示例还需要在当前目录中有一个名为“image.jpg”的图像文件(或者您可以在loadImage 方法中编辑默认路径)。

    如果您对 PySide/PyQt 没有太多经验,我建议您通过 this tutorial 工作。它是为 PyQt5 编写的,但 PySide2 的代码将 99% 相同。如上所述,您通常只需要更改导入并删除一些 API 的 pyqt 前缀,例如 pyqtSignalpyqtSlot。完整的 PySide2 文档可以在 here 找到,完整的 Qt 文档是 here

    【讨论】:

    • 非常感谢@ekhumoro 提供了许多有用资源的广泛而准确的答案!同时,我可以在Qlabel 中加载图像,但在将Qlabel 与主窗口集成时确实很困难。我要去读资源!再次感谢
    • 如果我可以问你@ekhumoro,当我用鼠标放大图像时,图像本身会被放大,但是当用鼠标单击获取坐标时(我猜是mousePressEvent 方法),我得到坐标就好像图像没有缩放,或者好像图像的缩放比例改变了,但鼠标事件没有改变?运行应用程序时你有吗?如果你想让我问另一个问题,我可以。如果你没有时间,我完全理解
    • @ecjb。嗯,这是一个非常基本的例子,所以它只是获取鼠标相对于视口的位置 - 它根本不考虑图像本身。
    • @ecjb。 PS:有像mapToScenemapFromScene这样的方法可以在视口和场景坐标之间进行转换。
    • 好吧,我不得不说我已经尝试了一周了。我将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'。知道我可以往哪个方向走吗? (如果需要,我可以提出一个新问题)
    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2011-05-16
    相关资源
    最近更新 更多