python - 在 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_())
我哪里做错了?
解决方案
您需要为每个标签安装事件过滤器,然后您才能知道按下了哪个标签:
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
推荐阅读
- sql - 使用 mod(id, N) 查找具有唯一值的前 N 行
- python - pip install -find-links 搜索顺序
- arrays - 使用谷歌表格公式获取具有数量的单元格的表头并在账单中显示
- spring-integration - 多个实例上的 Spring 集成邮件
- python - tkinter Python中的键绑定
- r - 如何将一行移动一列?
- ansible - 访问变量中的变量
- sql - 通过汇总另一个表中的字段来更新表字段
- windows - 使用 WFP 在 ALE_CONNECT_REDIRECT_V4 层重定向每个应用的 DNS 请求
- postgresql - PostgreSQL:删除 PostgreSQL 12 后 psql 版本 12.2 仍然存在