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

