PyQT. Пытаюсь реализовать сигнал enterEvent на Label. Возникла ошибка

Есть цель - связать событие "Наведение курсора на Label1", после чего планируется появление другого Label2 с PixMap в определенном месте окна.

from PyQt5 import QtCore, QtWidgets

class MyLabel(QtWidgets.QLabel):
    def __init__(self, text, parent=None):
        QtWidgets.QLabel.__init__(self, text, parent)
        self.setAlignment(QtCore.Qt.AlignCenter)

def enterEvent(self, e):
    self.setText("Указатель в области компонента")
    QtWidgets.QLabel.enterEvent(self, e)

def leaveEvent(self, e):
    self.setText("Указатель вне области компонента")
    QtWidgets.QLabel.leaveEvent(self, e)

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.resize(300, 150)
        self.label = MyLabel("Наведите мышь на рамку")
        self.label.setFrameStyle(QtWidgets.QFrame.Box |
                                 QtWidgets.QFrame.Plain)
        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.setLayout(self.vbox)

    self.label.enterEvent(QtCore.QEvent(10)).connect(obr)
def obr():
    print(5)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

**

Traceback (most recent call last):
  File "C:/dip/tests/Vasil/Slots.py", line 35, in <module>
    window = MyWindow()
  File "C:/dip/tests/Vasil/Slots.py", line 28, in __init__
    self.label.enterEvent(QtCore.QEvent(10)).connect(obr)
AttributeError: 'NoneType' object has no attribute 'connect'
Process finished with exit code 1

**


Ответы (2 шт):

Автор решения: gil9red

Подправил код и сделал отлов событий через фильтр событий.

Фильтр позволяет обрабатывать события других виджетов. А если возвращать True, то пойманное событие не дойдет до виджета, но в примере я возвращаю False, чтобы на MyLabel показывался текст Указатель в области компонента.

Пример:

from PyQt5 import QtCore, QtWidgets

class MyLabel(QtWidgets.QLabel):
    def __init__(self, text, parent=None):
        super().__init__(text, parent)
        self.setAlignment(QtCore.Qt.AlignCenter)

    def enterEvent(self, e):
        self.setText("Указатель в области компонента")
        super().enterEvent(e)

    def leaveEvent(self, e):
        self.setText("Указатель вне области компонента")
        super().leaveEvent(e)

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__( parent)
        self.resize(300, 150)

        self.label = MyLabel("Наведите мышь на рамку")
        self.label.setFrameStyle(QtWidgets.QFrame.Box | QtWidgets.QFrame.Plain)
        self.label.installEventFilter(self)

        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.setLayout(self.vbox)

    def eventFilter(self, obj, event: QtCore.QEvent):
        if obj == self.label and event.type() == QtCore.QEvent.Enter:
            print(5)
            return False

        return super().eventFilter(obj, event)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
→ Ссылка
Автор решения: S. Nick

Не надо вызывать обработчик событий enterEvent напрямую.

Вызовите из него функцию obr и все.

from PyQt5 import QtCore, QtWidgets

class MyLabel(QtWidgets.QLabel):
    def __init__(self, text, parent=None):
        QtWidgets.QLabel.__init__(self, text, parent)
        self.setAlignment(QtCore.Qt.AlignCenter)

    def enterEvent(self, e):
        self.setText("Указатель в области компонента")

        obr()                                                     # ДА !!!

        QtWidgets.QLabel.enterEvent(self, e)

    def leaveEvent(self, e):
        self.setText("Указатель вне области компонента")
        QtWidgets.QLabel.leaveEvent(self, e)

class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.resize(300, 150)

        self.label = MyLabel("Наведите мышь на рамку")
        self.label.setFrameStyle(QtWidgets.QFrame.Box |
                                 QtWidgets.QFrame.Plain)

        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addWidget(self.label)
        self.setLayout(self.vbox)

#    self.label.enterEvent(QtCore.QEvent(10)).connect(obr)         # НЕТ !


def obr():
    print(5, 'Указатель в области компонента, делайте что-нибудь!')


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка