首页 > 解决方案 > 在 PyQt5 中找到多个随机创建的小部件(如 QLabel、QPushButton 等)的 mousepress 事件的父级

问题描述

我已经使用具有相同变量的 for 循环创建了多个 QLabels 。现在我需要知道从哪里/哪个 Lable,MousePress 事件被触发。有什么办法像

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

我哪里做错了?

标签: pythonpython-3.xpyqtpyqt5qlabel

解决方案


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

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  

推荐阅读