PyQt QTableView — захват события KeyDown/KeyPress

Я хочу зафиксировать 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")

Если это на самом деле DEL-Keydown, я хотел бы переместить строку, выбранную в данный момент.

QTableView есть метод keyPressEvent, которому нужен QKeyEvent — как мне получить это событие?


person Project_Prkt    schedule 13.08.2018    source источник
comment
Можете ли вы опубликовать больше кода?   -  person S. Nick    schedule 13.08.2018


Ответы (1)


Для вашего случая у вас есть следующие возможные решения:

  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
  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")
person eyllanesc    schedule 13.08.2018
comment
Большое спасибо! Это именно то, что я искал. - person Project_Prkt; 14.08.2018
comment
Нужно ли добавлять pyqtSlot над def someSlot(self):? - person Jason; 06.05.2019
comment
@Jason Использование @pyqtSlot рекомендуется, но не обязательно. - person eyllanesc; 06.05.2019