在 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
我使用 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