найти родительское событие нажатия мыши для нескольких случайно созданных виджетов (например, QLabel, QPushButton и т. Д.) В PyQt5

#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