PyQt QTableView - 捕获 KeyDown / KeyPress 事件

Pro*_*rkt 2 python pyqt qtableview qkeyevent pyqt5

我想Key Down捕获QTableView. 我还想确定,如果它是DEL按钮上的按键,我的QTableView创建方式如下(来自QtCreator):

self.tblview_data_sources = QtWidgets.QTableView(self.groupBox_2)
self.tblview_data_sources.setGeometry(QtCore.QRect(10, 20, 721, 121))
self.tblview_data_sources.setObjectName("tblview_data_sources")
Run Code Online (Sandbox Code Playgroud)

如果它实际上是 DEL 键按下,我想重新移动当前选择的行。

QTableView有这个方法keyPressEvent需要QKeyEvent- 我如何获得这个事件?

eyl*_*esc 5

针对您的情况,您有以下可能的解决方案:

  1. keyPressEvent:使用 keyPressEvent 方法,但为此您必须创建一个继承自 QTableView 的类并覆盖该方法。

class TableView(QtWidgets.QTableView):
    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Delete:
            print("DELETE")
        super(TableView, self).keyPressEvent(event)
...

def setupUi(self, SOME):
     ...
     self.tblview_data_sources = TableView(self.groupBox_2) # change QtWidgets.QTableView to TableView
Run Code Online (Sandbox Code Playgroud)
  1. eventFilter:使用 eventFilter,为此您必须使用 installEventFilter,但为此您的类必须从某个继承自 QObject 的类继承,如果您使用的是 Qt Designer,则该类则不是,这也涉及很多行代码,因此我将省略例子。

  2. QShortcut:由于其简单性,我首选的解决方案是使用QShortcut


    QtWidgets.QShortcut(QtCore.Qt.Key_Delete, self.tblview_data_sources, activated=self.someSlot)
    ...
def someSlot(self):
    print("DELETE")
Run Code Online (Sandbox Code Playgroud)