Как загрузить изображение с помощью QLabel в PySide2

Я новичок в программировании и питоне. Я читал, что 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, я предпринял следующую Попытку №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())

person ecjb    schedule 07.05.2018    source источник


Ответы (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. См. этот пример средства просмотра изображений для базовой демонстрации, которая обеспечивает панорамирование и масштабирование. Он написан с использованием PyQt5, но вы можете легко преобразовать его в PySide2 — просто замените PyQt5 на PySide2 в импорте в верхней части файла и замените pyqtSignal на Signal в строке 4. В примере также требуется файл изображения с именем «image. jpg" в текущем каталоге (или вы можете просто отредактировать путь по умолчанию в методе loadImage).

Если у вас нет большого опыта работы с PySide/PyQt, я бы порекомендовал вам изучить это руководство. Он написан для PyQt5, но код будет на 99% идентичен для PySide2. Как было предложено выше, вам обычно нужно будет только изменить импорт и удалить несколько префиксов pyqt для API, таких как pyqtSignal и pyqtSlot. Полную документацию по PySide2 можно найти здесь, а полную документацию по Qt можно найти здесь.

person ekhumoro    schedule 07.05.2018
comment
Большое спасибо @ekhumoro за ваш обширный и очень точный ответ со множеством полезных ресурсов! В то же время я мог загрузить изображение в Qlabel, но действительно изо всех сил пытался интегрировать Qlabel с главным окном. Я собираюсь читать ресурсы! Еще раз большое спасибо - person ecjb; 07.05.2018
comment
Если я могу спросить вас, @ekhumoro, когда я увеличиваю изображение с помощью мыши, само изображение увеличивается, но при щелчке мышью, чтобы получить координату (я думаю, метод mousePressEvent), я получаю координату, как если бы изображение было не увеличено или как будто масштабирование было изменено для изображения, но не для событий мыши? У вас было такое при запуске приложения? если вы хотите, чтобы я задал еще один вопрос, я могу. Если у вас нет времени, я полностью понимаю - person ecjb; 08.05.2018
comment
@ecjb. Ну, это очень простой пример, так что он просто получает положение мыши относительно окна просмотра — само изображение вообще не принимается во внимание. - person ekhumoro; 08.05.2018
comment
@ecjb. PS: есть такие методы, как mapToScene и mapFromScene, который может выполнять перевод между координатами области просмотра и сцены. - person ekhumoro; 08.05.2018
comment
Ну, я должен сказать, что я пытался в течение недели. Я изменил строку 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'. Есть идеи, в каком направлении я мог бы пойти? (могу задать новый вопрос, если нужно) - person ecjb; 14.05.2018