Implementando keyPressEvent en QWidget

Tengo una ventana de QDialog que tiene un botón de continuar. El botón Continuar es el botón predeterminado porque siempre que presiono la tecla Intro, se presiona el botón Continuar. Descubrí algo extraño: cuando presiono la tecla Intro tres veces, el botón Continuar presiona tres veces. Sin embargo, cuando lo presiono por cuarta vez, toda la ventana se cierra. Tengo un botón de cancelación justo debajo del botón de continuar que cierra la ventana, pero no hago que el botón de cancelar sea el botón predeterminado ni nada.

Quería anular el keyPressEvent para que siempre que esté en la ventana, el botón Entrar siempre esté conectado al botón Continuar.

Esto es lo que tengo ahora:

 class ManualBalanceUI(QtGui.QWidget): keyPressed = QtCore.pyqtSignal() def __init__(self, cls): super(QtGui.QWidget, self).__init__() self.window = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint) self.ui = uic.loadUi('ManualBalanceUI.ui', self.window) self.keyPressed.connect(self.on_key) def keyPressEvent(self, event): super(ManualBalanceUI, self).keyPressEvent(event) self.keyPressed.emit(event) def on_key(self, event): if event.key() == QtCore.Qt.Key_Enter and self.ui.continueButton.isEnabled(): self.proceed() # this is called whenever the continue button is pressed elif event.key() == QtCore.Qt.Key_Q: self.window.close() # a test I implemented to see if pressing 'Q' would close the window def proceed(self): ... ... 

Sin embargo, esto no parece estar haciendo nada en este momento. Al presionar ‘Q’ no se cierra la ventana, y realmente no puedo decir si la tecla ‘enter’ está funcionando o no.

Miré esta pregunta de antemano: PyQt Connect to KeyPressEvent

También revisé toda la documentación en SourceForge. Cualquier ayuda sería muy apreciada!

Puede hacer dos formas y una es simplemente volver a implementar keyPressevent sin ningún trabajo extravagante. Me gusta esto

 from PyQt4 import QtCore, QtGui import sys class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.setGeometry(300, 300, 250, 150) self.show() def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Q: print "Killing" self.deleteLater() elif event.key() == QtCore.Qt.Key_Enter: self.proceed() event.accept() def proceed(self): print "Call Enter Key" def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 

O como lo intentó con las señales, en su caso, si no pudo implementar esta señal correctamente, aquí está la versión actualizada.

 class Example(QtGui.QWidget): keyPressed = QtCore.pyqtSignal(QtCore.QEvent) def __init__(self): super(Example, self).__init__() self.setGeometry(300, 300, 250, 150) self.show() self.keyPressed.connect(self.on_key) def keyPressEvent(self, event): super(Example, self).keyPressEvent(event) self.keyPressed.emit(event) def on_key(self, event): if event.key() == QtCore.Qt.Key_Enter and self.ui.continueButton.isEnabled(): self.proceed() # this is called whenever the continue button is pressed elif event.key() == QtCore.Qt.Key_Q: print "Killing" self.deleteLater() # a test I implemented to see if pressing 'Q' would close the window def proceed(self): print "Call Enter Key" def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main() 

Para la respuesta de Achayan, tuve éxito con el código. Puede ser la tecla enter y la tecla de retorno. Prueba Key_Enter y Key_Return. Son diferentes en mi teclado.