@Dogrtt
Qt/Python разработчик

Как определить по какому QLabel сработал mousePressEvent?

Всем добра.

Пишу интерфейс на PyQt5. Есть QFrame, в котором расположено 9 QLabel с QPixmap(QImage). При клике на изображение (QLabel), вызываю функцию.

На данный момент, проблема состоит в том, что реализовал я все очень криво, совсем не 'pythonic way' (хотя я, как самоучка, обычно не парюсь по поводу красоты, так как не знаю, что это(Я старый солдат, и не знаю слов любви, донна Роза ...)). В __init__() главного окна я пишу вот такую лабуду:

self.ui.label_gv_0.mousePressEvent = self.set_img_0
    self.ui.label_gv_1.mousePressEvent = self.set_img_1
    self.ui.label_gv_2.mousePressEvent = self.set_img_2
    self.ui.label_gv_3.mousePressEvent = self.set_img_3
    self.ui.label_gv_4.mousePressEvent = self.set_img_4
    self.ui.label_gv_5.mousePressEvent = self.set_img_5
    self.ui.label_gv_6.mousePressEvent = self.set_img_6
    self.ui.label_gv_7.mousePressEvent = self.set_img_7
    self.ui.label_gv_main.mousePressEvent = self.set_img_m


Соответственно приходится создавать 9 одинаковых функций, что есть позор. Вот пример:

def set_img_0(self, event):
    global last_buffered_img
    last_buffered_img = nine['img_0']
    self.show_img(nine['img_0'])
    self.del_img()
    self.nine_in_one()


Как я понял, из QMouseEvent, вытащить информацию можно только о координатах, но не о конкретном объекте. Подскажите, как поступать в таких ситуациях? Как отловить, по какому конкретно изображению кликнули, или как передать в вызываемый метод параметр с именем изображения при таком отлове события? Как вообще в питоне группировать подобные вещи, чтобы получалось красиво, кратко и элегантно?
  • Вопрос задан
  • 506 просмотров
Пригласить эксперта
Ответы на вопрос 1
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Есть статический метод sender, чтобы убедиться, что это именно QLabel используй qobject_cast:
auto label = qobject_cast<QLabel *>(sender());
if(!label)
  return;

Это код на C++ если что
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы