Событие - ловить только Qt.Key_Delete - PullRequest
1 голос
/ 21 апреля 2011

Я хотел бы изменить поведение Key_Delete для QTableWidget, но из-за использования Designer я не хочу вносить какие-либо изменения в 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)

но это не работает.

1 Ответ

4 голосов
/ 06 мая 2011

Во-первых: «но это не работает», как правило, недостаточно наглядно. Какое поведение вы ожидали? Какое поведение вы видели вместо этого? Были ли сообщения об ошибках?

Здесь я легко вижу несколько ошибок.

  1. Вы переопределяете метод QTableWidget.keyPressEvent, который ожидает 2 аргумента: (экземпляр QTableWidget, событие). Но в коде, который вы показываете выше, функция, которую вы используете для переопределения, принимает только 1 аргумент (первый аргумент 'self' не считается, так как он предоставляется автоматически).

  2. Поскольку вы установили QTableWidget.keyPressEvent = self.test, и вы также пытаетесь вызвать эту функцию из в self.test (), вы создали бесконечно рекурсивную функцию.

  3. Когда вы вызываете QTableWidget.keyPressEvent, первый передаваемый вами аргумент (self) - это объект QMainWindow. Однако, как я упоминал выше, эта функция ожидает QTableWidget в качестве первого аргумента.

  4. Поскольку вы переопределяете этот метод на уровне 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 «продвигает» виджет таблицы в ваш новый класс.

...