python - 在 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")
解决方案
您必须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 种可能的实现:
提升 QTableView 以在 Qt 设计器中使用。
使用 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)
推荐阅读
- python - 在将数据导入 MySQL 之前,在 Python 中的数据清理活动期间将所有反斜杠“\”替换为前斜杠“/”
- flutter - 如何在flutter中自定义水平时间选择器?
- laravel - Wordpress 面临的帖子名称永久链接问题无法正常工作,但在将网站迁移到 live aws elastic beanstalk 后,普通链接正在工作
- android - 我可以做什么?在这个错误中 Fastlane [!] Google Api Error: Invalid request - UploadException:ADHOC_PACKAGE_NAME_MISMATCH [[]]
- fortify - 强化报告生成器
- php - Woocommerce - 获取子类别的父类别名称
- reactjs - 如何从 React 中的对象数组中打字
- flutter - 如何使用 PaginatedDataTable 更改列的背景颜色
- flutter - 为什么补间动画总是从 0.0 运行到 1.0?
- android - 仅使用电话号码向 Android 和 iOS 发送 PUSH 通知