You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5技术问询:如何判断循环生成的网格按钮中哪个被按下

如何识别网格中被点击的QPushButton按钮位置

有几种简单直接的方法可以实现这个需求,下面逐个说明:

方法1:绑定信号时传递行列参数

在创建按钮时,用lambda把当前的行i和列j作为参数绑定到点击信号的槽函数上,让槽函数直接获取点击按钮的位置信息。

修改后的代码示例:

def on_button_clicked(row, col):
    print(f"按钮({row},{col})被点击")

# 原循环部分修改
for i in range(30):
    for j in range(30):
        button = QPushButton()
        # 用r=i、c=j捕获当前循环的行列值,避免所有按钮绑定最终循环值
        button.clicked.connect(lambda checked, r=i, c=j: on_button_clicked(r, c))
        layout.addWidget(button, i, j)

方法2:给按钮设置自定义属性存储位置

给每个按钮添加自定义的row和col属性,点击时通过sender()获取当前按钮,再读取这些属性值。

示例代码:

def on_button_clicked():
    button = sender()
    row = button.property("row")
    col = button.property("col")
    print(f"按钮({row},{col})被点击")

# 原循环部分修改
for i in range(30):
    for j in range(30):
        button = QPushButton()
        button.setProperty("row", i)
        button.setProperty("col", j)
        button.clicked.connect(on_button_clicked)
        layout.addWidget(button, i, j)

方法3:通过布局反向查找按钮位置

如果不想额外处理参数或属性,也可以借助布局的方法反向定位按钮的行列:

def on_button_clicked():
    button = sender()
    index = layout.indexOf(button)
    if index != -1:
        row, col, _, _ = layout.getItemPosition(index)
        print(f"按钮({row},{col})被点击")

# 原循环部分修改
for i in range(30):
    for j in range(30):
        button = QPushButton()
        button.clicked.connect(on_button_clicked)
        layout.addWidget(button, i, j)

这种方法依赖布局结构,若后续按钮位置有变动,需确保布局同步更新。

内容的提问来源于stack exchange,提问作者XM C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:48:21