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_())
