我在PyQt5和Qt设计器中使用一个PyQt5来创建数据表。我需要一点帮助才能找到一种简单的方法,使"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")发布于 2019-09-24 23:34:01
您必须让新的QModelIndex使用moveCursor()方法,并使用selectionModel()的setCurrentIndex()方法设置新的选择。
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.
在本例中,我将展示如何实现第二个方法:
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)https://stackoverflow.com/questions/58089121
复制相似问题