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
相关产品推荐
相关产品推荐

