在PyQt5中查找多个随机创建的小部件(如QLabel、QPushButton等)的mousepress事件的父级



我使用为具有相同变量的循环创建了多个QLabel。现在我需要知道从哪里/哪个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_())

我哪里做错了?

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

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  

最新更新