2014-12-15 11 views
5

determinati widget mi permetterà di fare:PyQt Connect to KeyPressEvent

self.widget.clicked.connect(on_click) 

ma facendo:

self.widget.keyPressEvent.connect(on_key) 

fallirà dicendo che l'oggetto non ha attributo 'collegarsi'.

So che la sottoclasse del widget e la reimplementazione del metodo keyPressEvent mi consentiranno di rispondere all'evento. Ma come posso, a partire da un contesto utente, .connect() per l'evento della tastiera?

+0

Correggetemi se ho torto, ma keyPressEvent non è uno slot quindi non può essere collegato. Devi gestirlo usando uno qualsiasi dei gestori di eventi. –

risposta

8

creare un segnale personalizzato, ed emettono dal vostro gestore di eventi reimplementato:

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: chiamare l'implementazione della classe base è necessario al fine di mantenere la gestione esistente di eventi).

+1

Non hai bisogno di sovrascrivere '__init__' e chiamare il super' __init__'? – wesanyer

+0

@wesanyer. No. Python chiama sempre automaticamente '__init__' su ogni classe base, indipendentemente dal fatto che sia stata o meno sovrascritta. Ma ovviamente, se ** fai ** override '__init__', dovrai chiamare esplicitamente anche l'implementazione della classe base (perché non sarà più chiamata automaticamente). – ekhumoro

+0

Ah ah, grazie signore. – wesanyer

3

Il modo in cui l'ho fatto in passato è (è un problema), dove si trova nel mittente e il ricevitore dichiara/si connette al segnale.

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