如何检测在 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.MouseButtonReleaseevent.button() == QtCore.Qt.LeftButtonevent.pos() in source.rect()。唯一的问题是这没有考虑到可能导致点击的键盘事件:如果按钮有焦点,则空格键,如果按钮设置为默认值并且没有其他小部件对它们做出反应,则返回/输入键,或按钮助记符(“下划线”字母快捷方式)被调用。

以上是关于如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

检测到在 react-router 中按下了后退按钮

确定在 Tkinter 中按下了哪个按钮?

RadGridView 检测 CellClick 事件按钮

如何检测是不是在 C++ 中按下了除特定键盘键之外的任何键盘键?

在 PyQt5 中按下时如何切换按钮文本

如何告诉 UIViewController 在 UIPopOverController 中按下了按钮?