Кликабельный Qlabel: привязка нескольких меток к одной функции - PullRequest
0 голосов
/ 01 февраля 2020

Все эти метки объявлены в initUi. Они сконструированы так:

        ligne_1_left_cord = 300
        self.label_ligne_1_1 = QtWidgets.QLabel(self)
        pic_signe_tab =QPixmap('img/tab.png')
        self.label_ligne_1_1.setPixmap(pic_signe_tab)
        self.label_ligne_1_1.move(ligne_1_left_cord,300)
        self.label_ligne_1_1.mousePressEvent = self.label_click

        self.label_ligne_1_2 = QtWidgets.QLabel(self)
        self.label_ligne_1_2.setPixmap(pic_signe_tab)
        self.label_ligne_1_2.move( ligne_1_left_cord +85,300)

Когда я нажимаю label_ligne_1_1, функция label_click делает это:

def label_click(self,event):
        signe_pixmap = QPixmap('img/tabx.png')
        self.label_ligne_1_1.setPixmap(signe_pixmap)

enter image description here

Есть ли способ передать переменную при вызове label_click, чтобы связать ее со всеми метками и использовать одну и ту же функцию? Как-то так?

1 Ответ

1 голос
/ 01 февраля 2020

Переопределение функций таким способом не предлагается, особенно для того, что считается защищенными функциями в Qt, как в случае любой *Event() функции QObjects и QWidgets.

Кроме того, в вашем случае вы просто перезаписываете метод с той же сигнатурой, что никогда не позволит вам получить источник вызова функции.
Возможным решением будет использование лямбда-выражения с источник в качестве ключевого аргумента:

self.label_ligne_1_1.mousePressEvent = lambda ev, label=self.label_ligne_1_1: self.label_click(label)

Но я бы не советовал вам это делать. Вместо этого лучшим подходом будет установить фильтр событий на каждую метку, а затем устанавливать растровое изображение каждый раз, когда захватывается событие нажатия мыши:

class Squares(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QGridLayout(self)
        layout.setSpacing(0)

        for row in range(4):
            for col in range(4):
                square = QtWidgets.QLabel()
                square.setPixmap(QtGui.QPixmap('tab.png'))
                layout.addWidget(square, row, col)
                setattr(self, 'label_ligne_{}_{}'.format(row + 1, col + 1), square)
                square.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            source.setPixmap(QtGui.QPixmap('tabx.png'))
        return super().eventFilter(source, event)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...