Вопрос

я хочу унаследовать QLabel, чтобы добавить туда обработку событий click.Я пробую этот код:

class NewLabel(QtGui.QLabel):
    def __init__(self, parent):
        QtGui.QLabel.__init__(self, parent)

    def clickEvent(self, event):
        print 'Label clicked!'

Но после нажатия у меня нет строки "Ярлык нажат!"

Редактировать:

Хорошо, теперь я использую не 'ClickEvent', а 'mousePressEvent'.И у меня все еще есть вопрос.Как я могу узнать, на какую именно метку был нажат?Например, у меня есть 2 окна редактирования и 2 ярлыка.Содержимое ярлыков - это пиксельные изображения.Таким образом, в ярлыках нет никакого текста, поэтому я не могу различить разницу между ярлыками.Как я могу это сделать?

РЕДАКТИРОВАТЬ 2: Я создал этот код:

class NewLabel(QtGui.QLabel):
    def __init__(self, firstLabel):
        QtGui.QLabel.__init__(self, firstLabel)

    def mousePressEvent(self, event):
        print 'Clicked'
        #myLabel = self.sender()  # None =)
        self.emit(QtCore.SIGNAL('clicked()'), "Label pressed")

В другом классе:

self.FirstLang = NewLabel(Form)
QtCore.QObject.connect(self.FirstLang, QtCore.SIGNAL('clicked()'), self.labelPressed)

Слот в том же классе:

def labelPressed(self):
    print 'in labelPressed'
    print self.sender()

Но в self нет объекта-отправителя.Что я сделал не так?

Это было полезно?

Решение

Отвечая на ваш второй вопрос, я продолжу, основываясь на примере @gnud:

  • подкласс QLabel, переопределите mouseReleaseEvent и добавьте сигнал в класс, давайте назовем его clicked.
  • проверьте, какая кнопка была нажата в mouseReleaseEvent, если она левая, подает сигнал о нажатии.
  • подключите слот к вашим ярлыкам clicked signal и используйте отправитель() внутри, чтобы узнать, какая QLabel была нажата.

Другие советы

Там нет никакой функции clickEvent в QWidget/QLabel.Вы могли бы подключить эту функцию к сигналу Qt, или вы могли бы сделать:

class NewLabel(QtGui.QLabel):
    def __init__(self, parent=None):
        QtGui.QLabel.__init__(self, parent)
        self.setText('Lorem Ipsum')

    def mouseReleaseEvent(self, event):
        print 'Label clicked!'

Ответ от PyQt Вики работает очень хорошо, но я бы добавил, что clickable класс должен вызывать widget.mouseReleaseEvent (прямо перед return True), на всякий случай, если пользователь настроил это событие.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top