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

PyQt5使用QAbstractTableModel时如何绑定方向键触发行首列值获取方法

解决方案

核心修改逻辑

你当前只绑定了鼠标点击触发的clicked信号,该信号仅响应鼠标操作。方向键切换选中行时,触发的是表格选择模型的currentChanged信号,直接绑定该信号即可同时覆盖鼠标点击、方向键导航两种选中场景,无需重写按键事件或子类化控件。
注意currentChanged信号会自动传递两个参数(新选中的索引、上一次选中的索引),需要在你的取值方法中增加参数承接,避免参数不匹配报错。

修改后完整可运行代码

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QAbstractTableModel, QVariant

test_data = [[i,j,k] for i in range(2) for j in range(2) for k in range(2)]

class TableStaticModel(QAbstractTableModel):
    def __init__(self, header, data):
        super(TableStaticModel, self).__init__()
        self._data = data
        self.header = header

    def data(self, index, role=Qt.DisplayRole):
        if role==Qt.DisplayRole:
            return self._data[index.row()][index.column()]
    
        if role==Qt.TextAlignmentRole:
            value = self._data[index.row()][index.column()]
            return Qt.AlignCenter
    
    def rowCount(self, index):
        return len(self._data)

    def columnCount(self,index):
        return len(self._data[0])

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return QVariant(self.header[col])
        return QVariant()

        
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.table = QtWidgets.QTableView()
        model = TableStaticModel(['A','B','C'],test_data)
        self.table.setModel(model)
        # 绑定选中变更信号,覆盖所有选中行切换场景
        self.table.selectionModel().currentChanged.connect(self.get_table_row_value)
        self.table.setSelectionBehavior(self.table.SelectRows)
        self.table.resizeRowsToContents()
        self.table.setColumnWidth(0,83)
        self.table.setColumnWidth(1,85)
        self.table.setColumnWidth(2,83)
        self.setCentralWidget(self.table)

    # 增加参数承接currentChanged传递的两个索引参数
    def get_table_row_value(self, current, previous):
        index=self.table.selectionModel().currentIndex()
        value=index.sibling(index.row(),0).data()
        print(value)

app=QtWidgets.QApplication(sys.argv)
window=MainWindow()
window.show()
app.exec_()

补充说明

你之前尝试的QAbstractItemModel信号是响应表格数据本身变更的,和选中状态变更无关,所以不会生效。重写keyPressEvent虽然也能实现需求,但属于冗余实现,Qt已经内置了选中状态变更的专用信号,直接使用效率更高且不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:30:05