Я хотел бы изменить поведение Key_Delete для QTableWidget, но из-за использования конструктора я не хочу вносить какие-либо изменения в файл py с формой. Поэтому вместо переопределения QTableWidget, как будто это ответ: Как реализовать MousePressEvent для виджета Qt-Designer в PyQt Я делаю что-то вроде этого:
class MyForm(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.tableWidget.__class__.keyPressEvent = self.test
def test(self,event):
if event.key() == Qt.Key_Delete:
print "test"
return QTableWidget.keyPressEvent(self, event)
Проблема в том, что я не знаю, как сохранить оригинальное поведение других ключей, чем Qt.Key_Delete. Я уже изменил последнюю строку следующим образом:
return QtGui.QTableWidget.keyPressEvent(self, event)
return QtGui.QTableWidget.event(self, event)
но это не сработает.
Во-первых: "но он не работает", как правило, недостаточно описателен. Какое поведение вы ожидали? Каково было поведение, которое вы видели? Были ли сообщения об ошибках?
Я могу легко увидеть несколько ошибок здесь.
Вы переопределяете метод QTableWidget.keyPressEvent, который ожидает 2 аргумента: (экземпляр QTableWidget, событие). Но в коде, который вы показываете выше, функция, которую вы используете для переопределения, принимает только один аргумент (первый аргумент "self" не учитывается, поскольку он автоматически предоставляется).
Поскольку вы установили QTableWidget.keyPressEvent = self.test, и вы также пытаетесь вызвать эту функцию из self.test(), вы создали бесконечно рекурсивную функцию.
При вызове QTableWidget.keyPressEvent первым аргументом, который вы передали (self), является объект QMainWindow. Однако, как я уже упоминал выше, эта функция ожидает, что QTableWidget будет первым аргументом.
Поскольку вы переопределяете этот метод на уровне класса, ВСЕ 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 и, в рамках конструктора, "продвигать" виджет таблицы в ваш новый класс.