使用pyqt5 QAbstractTableModel时将箭头键连接到方法

Connect arrow key to method when using pyqt5 QAbstractTableModel

我正在尝试在 pyqt 中设计一个 table 小部件,它在使用箭头键导航 table 时获取行第一列中的值。我可以使用指针在我的 table class 上使用 clicked.connect() 来做到这一点,但是当使用箭头键导航 table 我无法管理想办法连接我的功能。我刚刚了解 pyqt,并尝试从文档中弄清楚这一点,但似乎 QAbstractItemModel 的任何信号方法都不起作用。不确定我是否尝试过正确的事情。我尝试将 KeyPressEvent 定义添加到我的 QAbstractTableView class 但无法使其工作 - 也尝试 subclassing QTableView 无济于事。当然不确定这些尝试是否正确。这是我的基本代码,它使 table 突出显示行并在通过指针单击选择该行时打印所选行的第一列中的值,但是如果您使用箭头键导航,显然不会打印任何内容,因为未调用打印值的方法。

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.clicked.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)

    def get_table_row_value(self):
        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_()

如果您只想select 一行,那么您必须将selectionModel 设置为SingleSelection。另一方面,您必须使用 selectionModel 的 selectionChanged 信号:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.table = QtWidgets.QTableView(
            selectionBehavior=QtWidgets.QTableView.SelectRows,
            selectionMode=QtWidgets.QTableView.SingleSelection,
        )
        model = TableStaticModel(["A", "B", "C"], test_data)
        self.table.setModel(model)
        self.table.selectionModel().selectionChanged.connect(self.get_table_row_value)
        self.table.resizeRowsToContents()
        self.table.setColumnWidth(0, 83)
        self.table.setColumnWidth(1, 85)
        self.table.setColumnWidth(2, 83)
        self.setCentralWidget(self.table)

    def get_table_row_value(self):
        rows = set()
        for index in self.table.selectedIndexes():
            rows.add(index.row())
        for row in rows:
            ix = self.table.model().index(row, 0)
            print(ix.data())