首页 > 解决方案 > 在 QAbstractTableModel tableView 中输入行为为 key_down

问题描述

我在 PyQt5 和 Qt Designer 中使用 QAbstractTableModel 来创建数据表。我需要一点帮助来找到一种简单的方法来使“Enter”keyPressEvent 向下移动表格,就像按下 Key_Down 按钮一样。以下代码捕获 Enter 键按下事件。如何让它移动光标?

我已经搜索了论坛并用谷歌搜索了这个问题,但我还没有找到解决方案。我尝试创建一个自定义事件来代替“ev”传递它,但这没有用。

def keyPressEvent(self, ev):        
    if ev.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
        print("Enter key pressed")

标签: pythonpyqtpyqt5

解决方案


您必须QModelIndex使用新的方法,并使用 的方法moveCursor()设置新的选择。setCurrentIndex()selectionModel()

from PyQt5 import QtCore, QtGui, QtWidgets


class TableView(QtWidgets.QTableView):
    def keyPressEvent(self, event):
        if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
            index = self.moveCursor(
                QtWidgets.QAbstractItemView.MoveDown, QtCore.Qt.NoModifier
            )
            command = self.selectionCommand(index, event)
            self.selectionModel().setCurrentIndex(index, command)
        else:
            super(TableView, self).keyPressEvent(event)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    model = QtGui.QStandardItemModel(10, 4)
    w = TableView()
    w.setModel(model)
    w.show()

    sys.exit(app.exec_())

如果您使用的是 Qt Designer,则有 2 种可能的实现:

  1. 提升 QTableView 以在 Qt 设计器中使用。

  2. 使用 eventFilter 实现逻辑。

在这种情况下,我将展示如何实现第二种方法:

class EventFilter(QtCore.QObject):
    def __init__(self, view):
        super(EventFilter, self).__init__(view)
        if not isinstance(view, QtWidgets.QAbstractItemView):
            raise TypeError("{} must be a QAbstractItemView".format(view))
        self._view = view
        self._view.installEventFilter(self)

    def eventFilter(self, obj, event):
        if obj is self._view and event.type() == QtCore.QEvent.KeyPress:
            if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter):
                index = self._view.moveCursor(
                    QtWidgets.QAbstractItemView.MoveDown, QtCore.Qt.NoModifier
                )
                command = self._view.selectionCommand(index, event)
                self._view.selectionModel().setCurrentIndex(index, command)
        return super(EventFilter, self).eventFilter(obj, event)

然后你在你的 QTableView 中设置它:

event_filter = EventFilter(self.tableView)

推荐阅读