pyqt4: Могу ли я переопределить метод без подкласса? - PullRequest
1 голос
/ 08 февраля 2012

Я надеюсь изменить метод "keyPressEvent ()" в QWidget.
Несомненно, я создаю новый класс, наследующий "QWidget", он может это сделать.
Но у меня есть возвращенный QWidget из метода.Итак, я не могу управлять возвращенным «QWidget» с помощью подкласса.
Как я могу сделать свой собственный метод «keyPressEvent ()» для QWidget?

1 Ответ

3 голосов
/ 08 февраля 2012

Установите фильтр событий на виджет и перехватите событие KeyPress :

from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.widget = QtGui.QWidget(self)
        self.widget.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.widget.installEventFilter(self)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.widget)

    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.KeyPress and
            source is self.widget):
            print('key pressed: %s' % event.text())
            return True
        return QtGui.QWidget.eventFilter(self, source, event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    window.resize(320, 240)
    sys.exit(app.exec_())

Обратите внимание, что в примере возвращается True для всех нажатий клавиш, что останавливает дальнейшую обработку этих событий. Если вы просто хотите «прослушивать» события, не обрабатывая их, убедитесь, что eventFilter возвращает False.

...