PyQt: как получать события клавиатуры в подклассе QWidget? - PullRequest
1 голос
/ 24 мая 2011

Может быть, об этом спрашивали много раз, но я не могу найти решение.

У меня есть диалог:

class PostDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.ui = Ui_Dialog() #code from designer!!
        self.ui.setupUi(self)

        self.ui.plainTextEdit = ContentEditor()

Этот диалог имеет QPlainTextEdit от дизайнера.

Мне нужно переопределить keyPress и keyRelease этого QPlainTextEdit.

Итак, я подкласс это:

class ContentEditor(QtGui.QPlainTextEdit):

    def __init__(self, parent=None):
        QtGui.QPlainTextEdit.__init__(self, parent)

    def keyPressEvent(self, event):
        print "do something"

но ContentEditor.keyPressEvent никогда не вызывается! Зачем?

Ответы [ 4 ]

3 голосов
/ 24 мая 2011

Я рекомендую использовать installEventFilter для этой цели:

Это будет выглядеть так:

class PostDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.ui = Ui_Dialog() #code from designer!!
        self.ui.setupUi(self)

        self.ui.plainTextEdit.installEventFilter(self)

    def eventFilter(self, event):
        if event.type() == QtCore.QEvent.KeyPress:
            # do some stuff ...
            return True # means stop event propagation
        else:
            return QtGui.QDialog.eventFilter(self, event)
2 голосов
/ 25 мая 2011

То, что вы пытаетесь выполнить, лучше сделать, если продвинуть в Qt Designer виджет QPlainTextEdit для вашего подкласса ContentEditor.
Документация Qt
В диалоге «Продвигаемые виджеты»:
«Повысить имя класса»: ContentEditor
«Заголовочный файл»: your_python_module_name.h

1 голос
/ 24 мая 2011

Может быть, вам нужно вызвать метод setFocusPolicy QWidget для получения события KeyPress. Из документов API QWidget для метода keyPressEvent :

This event handler, for event <i>event</i>, can be reimplemented in a subclass 
to receive key press events for the widget. A widget must call setFocusPolicy() 
to accept focus initially and have focus in order to receive a key press event.
0 голосов
/ 24 мая 2011

Вам, вероятно, просто нужно поменять местами следующие две строки:

self.ui.setupUi(self)
self.ui.plainTextEdit = ContentEditor()

Если вы напишите это так:

self.ui.plainTextEdit = ContentEditor()
self.ui.setupUi(self)

, вы убедитесь, что ваш пользовательский виджет привязан допользовательский интерфейс получает настройки.В противном случае вы просто заменяете ссылку на уже инициализированный объект.

...