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

PyQt6中如何获取QTableWidget中箭头键选中的高亮行号?

在PyQt6中监听箭头键移动QTableWidget高亮行并获取行号

问题核心是:默认点击行时tableWidget.currentRow()能返回行号,但通过箭头键移动选中高亮行时,没有触发对应的监听逻辑导致无法实时获取行号。解决思路是绑定QTableWidget的单元格/选中项变化信号,在信号触发时获取当前行号。

方案1:绑定currentCellChanged信号

该信号会在当前选中单元格变化时触发(包括箭头键移动、点击操作),直接传递当前行号参数:

from PyQt6.QtWidgets import QApplication, QTableWidget, QTableWidgetItem, QWidget, QVBoxLayout
import sys

class TableDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("QTableWidget行号监听")
        layout = QVBoxLayout()

        # 初始化表格并填充数据
        self.table_widget = QTableWidget(5, 2)
        for row in range(5):
            for col in range(2):
                self.table_widget.setItem(row, col, QTableWidgetItem(f"行{row+1}列{col+1}"))

        # 绑定单元格变化信号
        self.table_widget.currentCellChanged.connect(self.on_row_changed)

        layout.addWidget(self.table_widget)
        self.setLayout(layout)
        self.resize(400, 300)

    def on_row_changed(self, current_row, current_col, prev_row, prev_col):
        # 直接使用信号传递的current_row参数获取行号
        print(f"当前高亮行号:{current_row}")
        # 也可以用currentRow()方法获取,结果一致
        # print(f"当前高亮行号:{self.table_widget.currentRow()}")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    demo = TableDemo()
    demo.show()
    sys.exit(app.exec())

方案2:绑定currentItemChanged信号

如果需要通过选中项对象获取行号,可使用该信号:

# 替换方案1中的信号绑定和槽函数
self.table_widget.currentItemChanged.connect(self.on_item_changed)

def on_item_changed(self, current_item, prev_item):
    if current_item:  # 避免初始无选中项时报错
        print(f"当前高亮行号:{current_item.row()}")

原理说明

箭头键移动选中行时,QTableWidget的当前选中状态已经更新,currentRow()方法的返回值也会同步变化。之前无法实时获取,只是因为没有监听选中状态变化的信号,导致没有在状态更新时触发获取逻辑。绑定上述任意一个信号后,就能在箭头键移动时实时拿到当前行号。

内容的提问来源于stack exchange,提问作者Silvio Duarte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:27:22