Во-первых: «но это не работает», как правило, недостаточно наглядно. Какое поведение вы ожидали? Какое поведение вы видели вместо этого? Были ли сообщения об ошибках?
Здесь я легко вижу несколько ошибок.
Вы переопределяете метод QTableWidget.keyPressEvent, который ожидает 2 аргумента: (экземпляр QTableWidget, событие). Но в коде, который вы показываете выше, функция, которую вы используете для переопределения, принимает только 1 аргумент (первый аргумент 'self' не считается, так как он предоставляется автоматически).
Поскольку вы установили QTableWidget.keyPressEvent = self.test, и вы также пытаетесь вызвать эту функцию из в self.test (), вы создали бесконечно рекурсивную функцию.
Когда вы вызываете QTableWidget.keyPressEvent, первый передаваемый вами аргумент (self) - это объект QMainWindow. Однако, как я упоминал выше, эта функция ожидает QTableWidget в качестве первого аргумента.
Поскольку вы переопределяете этот метод на уровне class , ВСЕ QTableWidgets будут вынуждены использовать одну и ту же функцию keyPressEvent (это было бы очень проблематично). Вместо этого вы должны переопределить только метод вашего конкретного виджета: self.ui.tableWidget.keyPressEvent = self.test
(также обратите внимание, что подпись для tableWidget.keyPressEvent отличается от QTableWidget.keyPressEvent)
Пример: * * тысяча двадцать-восемь
from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
win = QtGui.QMainWindow()
win.show()
table = QtGui.QTableWidget()
win.setCentralWidget(table)
def test(event):
if event.key() == QtCore.Qt.Key_Delete:
print "delete"
return QtGui.QTableWidget.keyPressEvent(table, event)
table.keyPressEvent = test
Наконец, еще один (возможно, более чистый) подход заключается в создании подкласса QTableWdget и в Designer «продвигает» виджет таблицы в ваш новый класс.