2014-12-15 28 views
5

Niektóre widżety pozwoli mi zrobić:PyQt Połącz z keyPressEvent

self.widget.clicked.connect(on_click) 

ale robi:

self.widget.keyPressEvent.connect(on_key) 

zawiedzie mówiąc, że obiekt ma atrybut 'Connect'.

Wiem, że podklasy widget i ponowne wdrożenie metody keyPressEvent pozwoli mi odpowiedzieć na wydarzenie. Ale w jaki sposób mogę .connect() na wydarzenie klawiatury po tym, lub w inny sposób powiedział, z kontekstu użytkownika?

+0

Popraw mnie, jeśli się mylę, ale keyPressEvent nie jest gniazdem, więc nie można go podłączyć. Musisz sobie z tym poradzić za pomocą dowolnego programu obsługi zdarzeń. –

Odpowiedz

8

Tworzenie sygnału niestandardowego i emitują go z przepisany obsługi zdarzeń:

class MyWidget(QtGui.QWidget): 
    keyPressed = QtCore.pyqtSignal() 

    def keyPressEvent(self, event): 
     super(MyWidget, self).keyPressEvent(event) 
     self.keyPressed.emit() 
... 

self.widget.keyPressed.connect(on_key) 

(NB: wywołanie realizacja base-klasa jest wymagane w celu utrzymania istniejącej obsługi zdarzeń).

+1

Czy nie potrzebujesz uzupełnić '__init__' i zadzwonić do' __init__'? – wesanyer

+0

@wesanyer. Nie. Python zawsze automatycznie wywołuje '__init__' na każdej klasie bazowej, niezależnie od tego, czy został on nadpisany, czy nie. Ale oczywiście, jeśli ** masz ** nadpisać '__init__', będziesz musiał również jawnie wywołać implementację klasy bazowej (ponieważ nie będzie ona już wywoływana automatycznie). – ekhumoro

+0

Ah hah, dziękuję, proszę pana. – wesanyer

3

Sposób, w jaki robiłem to w przeszłości, jest (jest to praca dookoła), gdzie znajduje się w nadajniku, a odbiorca deklaruje/łączy się z sygnałem.

def keyPressEvent(self, event): 
    if type(event) == QtGui.QKeyEvent: 
     if event.key() == QtCore.Qt.Key_Space: 
      self.emit(QtCore.SIGNAL('MYSIGNAL'))