Как обнаружить щелчок мышью на изображениях, отображаемых в графическом интерфейсе, созданных с помощью PySide

Во-первых, я новичок в Python, Qt и PySide, поэтому простите меня, если этот вопрос кажется слишком простым.

То, что я пытаюсь сделать, – отобразить кучу фотографий в сетке в графическом интерфейсе, созданном с использованием PySide API. Кроме того, когда пользователь нажимает на фотографию, я хочу иметь возможность отображать информацию, соответствующую этой фотографии. Кроме того, я хотел бы, чтобы контейнер / виджет, используемый для отображения фотографии, позволял изменять фотографию, например, я мог бы заменить любую фотографию в сетке, не создавая снова всю сетку фотографий с нуля.

Первоначально я пытался использовать QLabel для отображения QPixmap, но я понял (ошибочно или нет), что у меня нет способа обнаружить щелчки мыши на ярлыке. После некоторого поиска у меня сложилось впечатление, что я должен подклассифицировать QLabel (или какой-либо другой соответствующий класс) и каким-то образом переопределить QWidget (родительский класс QLabel) mousePressEvent (), чтобы включить обнаружение щелчка мыши. Проблема в том, что я не уверен, как это сделать или есть ли какой-либо альтернативный виджет, который я могу использовать для хранения моих фотографий, отличных от QLabel, без необходимости проходить подклассовую настройку.

Может ли кто-нибудь предложить более подходящий контейнер, отличный от QLabel, для отображения фотографий, позволяя мне обнаруживать щелчки мыши на фотографии или предоставлять фрагмент кода для подкласса QLabel, чтобы он мог обнаружить щелчки мыши?

Заранее благодарим за любые ответы.

Я добавил пример того, как испускать сигнал и подключаться к другому слоту. Также документы очень полезны

from PySide.QtCore import * from PySide.QtGui import * import sys class Main(QWidget): def __init__(self, parent=None): super(Main, self).__init__(parent) layout = QHBoxLayout(self) picture = PictureLabel("pic.png", self) picture.pictureClicked.connect(self.anotherSlot) layout.addWidget(picture) layout.addWidget(QLabel("click on the picture")) def anotherSlot(self, passed): print passed print "now I'm in Main.anotherSlot" class PictureLabel(QLabel): pictureClicked = Signal(str) # can be other types (list, dict, object...) def __init__(self, image, parent=None): super(PictureLabel, self).__init__(parent) self.setPixmap(image) def mousePressEvent(self, event): print "from PictureLabel.mousePressEvent" self.pictureClicked.emit("emit the signal") a = QApplication([]) m = Main() m.show() sys.exit(a.exec_()) 

Даже если на вопрос был дан ответ, я хочу предоставить другой способ, который можно использовать в разных ситуациях (см. Ниже):

 from PySide.QtCore import * from PySide.QtGui import * import sys class Main(QWidget): def __init__(self, parent=None): super(Main, self).__init__(parent) layout = QHBoxLayout(self) picture = QLabel() picture.setPixmap("pic.png") layout.addWidget(picture) layout.addWidget(QLabel("click on the picture")) makeClickable(picture) QObject.connect(picture, SIGNAL("clicked()"), self.anotherSlot) def anotherSlot(self): print("AnotherSlot has been called") def makeClickable(widget): def SendClickSignal(widget, evnt): widget.emit(SIGNAL('clicked()')) widget.mousePressEvent = lambda evnt: SendClickSignal(widget, evnt) a = QApplication([]) m = Main() m.show() sys.exit(a.exec_()) 

Этот способ не подразумевает подклассов QLabel поэтому его можно использовать для добавления логики в виджет, созданный с помощью QtDeigner.

Плюсы:

  • Может использоваться через скомпилированные файлы QTdesigner
  • Может применяться к любому виду виджетов (возможно, вам потребуется включить super для переопределенной функции, чтобы обеспечить нормальное поведение виджета)
  • Такую же логику можно использовать для отправки других сигналов

Минусы:

  • Вы должны использовать синтаксис QObject для подключения сигналов и слотов