在 PyQt5 中找到多个随机创建的小部件(如 QLabel、QPushButton 等)的鼠标按下事件的父级

find parent of mousepress event of multiple randomly created widgets(like QLabel,QPushButton etc.) in PyQt5

我使用 for loop 创建了多个 QLabels 和相同的 variables.Now 我需要知道从 where/which Lable,MousePress 事件是 triggered.Is 有什么办法像

event.parent() OR event.widget()

我也尝试了 installEventFilter 但它不起作用,这是因为我在另一个 class 中创建了 Qlabels。 如果我在同一个 class 中创建这些标签,它正在工作,但我需要它在另一个 class 上也能工作。 这是我的代码:-

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

我哪里做错了?

您需要为每个标签安装事件过滤器,然后您才能知道按下了哪个标签:

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