#python #python-3.x #pyqt #pyqt5 #qlabel
#python #python-3.x #pyqt #pyqt5 #qlabel
Вопрос:
Я создал несколько QLabels, используя цикл for с одинаковыми переменными.Теперь мне нужно знать, откуда / из какой метки запускается событие нажатия мыши.Есть ли какой-нибудь способ, например
event.parent() OR event.widget()
Я также попробовал installEventFilter, но он не работает, это потому, что я создал Qlabels в другом классе.
Если я создаю эти метки в том же классе, он работает, но мне нужно, чтобы это работало и в другом классе.
Вот мой код:-
from PyQt5.QtWidgets import *
import sys
class Reader(QFrame):
def __init__(self,parent):
super().__init__(parent=parent)
self.parent=parent
self.parent.setCentralWidget(self)
self.vbox=QVBoxLayout()
self.setLayout(self.vbox)
for i in range (1,6):
obj=QLabel("Click")
obj.mousePressEvent=self.onmousepress
#obj.installEventFilter(self.parent)
self.vbox.addWidget(obj)
def onmousepress(self,event) :
print('where did it came from?')
def eventFilter(self, source, event):
#Nothing Worked Here
print(source,event)
return super().eventFilter(source, event)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(400,200)
self.reader=Reader(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
Где я ошибся?
Комментарии:
1. Если вы устанавливаете фильтр событий для родительского элемента, вы, очевидно, не используете фильтр объекта. Использовать
obj.installEventFilter(self)
. Кроме того, избегайте перезаписиself.parent
, поскольку существующиеself.parent()
всегда должны быть предпочтительнее.
Ответ №1:
Вам необходимо установить фильтр событий для каждой метки, тогда вы сможете узнать, какая метка нажата:
for i in range (1,6):
obj=QLabel(f"Click {i}")
obj.installEventFilter(self)
И:
def eventFilter(self, source, event):
if event.type() == QEvent.MouseButtonPress: # from PyQt5.QtCore import QEvent
print(source.text())
return super().eventFilter(source, event)
Вывод:
Click 1
Click 2
Click 3
Click 4
Click 5