如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]
Posted
技术标签:
【中文标题】如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]【英文标题】:How to detect that one of the dynamically added buttons was pressed in PyQt5? [duplicate] 【发布时间】:2020-02-05 12:56:47 【问题描述】:我有一个滚动区域,里面有 N 个按钮。我需要知道按下了哪个按钮。如何检测它? 我的代码:
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QApplication, QScrollArea,QHBoxLayout, QGroupBox, QPushButton, QFormLayout
import sys
class MainWindow(QDialog):
def __init__(self):
super().__init__()
self.setGeometry(10, 20, 500, 500)
layout = QHBoxLayout(self)
self.formLayout1 = QFormLayout()
self.groupBox1 = QGroupBox("test")
for i in range(20):
self.formLayout1.insertRow(0, QPushButton(str(i)))
self.groupBox1.setLayout(self.formLayout1)
scroll1 = QScrollArea()
scroll1.setWidget(self.groupBox1)
layout.addWidget(scroll1)
self.show()
if __name__ == '__main__':
App = QApplication(sys.argv)
window = MainWindow()
sys.exit(App.exec())
【问题讨论】:
将self.formLayout1.insertRow(0, QPushButton(str(i)))
更改为self.formLayout1.insertRow(0, QPushButton(str(i), clicked=lambda _, n=i: print(f'QPushButton_n')))
【参考方案1】:
您可以为所有按钮安装一个事件过滤器,给它们一个对象名称,然后按源检查它:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5 import *
import sys
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(10, 20, 500, 500)
layout = QHBoxLayout(self)
self.formLayout1 = QFormLayout()
self.groupBox1 = QGroupBox("test")
for i in range(20):
new_button = QPushButton(str(i), self)
button_name='button_number_'.format(i)
new_button.setObjectName(button_name)
new_button.installEventFilter(self)
self.formLayout1.insertRow(0,new_button)
self.groupBox1.setLayout(self.formLayout1)
scroll1 = QScrollArea()
scroll1.setWidget(self.groupBox1)
layout.addWidget(scroll1)
self.show()
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.MouseButtonPress:
print(source.objectName())
return super().eventFilter(source, event)
if __name__ == '__main__':
App = QApplication(sys.argv)
window = MainWindow()
sys.exit(App.exec())
【讨论】:
值得注意的是,当鼠标在其区域内释放时,按钮通常被认为是“单击”,而不是在按下 any 鼠标按钮时他们。 我明白了,那会是什么活动? 如果您使用 eventFilter(这很好,因为它在技术上比QObject.sender()
更可取),我会根据以下条件检查事件:event.type() == QtCore.QEvent.MouseButtonRelease
、event.button() == QtCore.Qt.LeftButton
和event.pos() in source.rect()
。唯一的问题是这没有考虑到可能导致点击的键盘事件:如果按钮有焦点,则空格键,如果按钮设置为默认值并且没有其他小部件对它们做出反应,则返回/输入键,或按钮助记符(“下划线”字母快捷方式)被调用。以上是关于如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]的主要内容,如果未能解决你的问题,请参考以下文章