2016-07-21 22 views
1

Ich habe ein QDialog-Fenster, das eine Schaltfläche zum Fortfahren hat. Die Schaltfläche "Fortsetzen" ist die Standardschaltfläche, denn wenn ich die Eingabetaste drücke, wird die Schaltfläche "Weiter" gedrückt. Ich habe etwas Seltsames entdeckt: Wenn ich dreimal die Eingabetaste drücke, drückt die Fortfahren-Taste dreimal. Wenn ich es jedoch ein viertes Mal drücke, schließt sich das ganze Fenster. Ich habe einen Abbrechen-Button direkt unter dem Fortfahren-Button, der das Fenster schließt, aber ich mache den Abbrechen-Button nicht zum Standard-Button oder so.Implementierung von keyPressEvent in QWidget

Ich wollte die keyPressEvent überschreiben, so dass immer, wenn ich in dem Fenster bin, die Eingabetaste immer mit dem Fortfahren-Button verbunden sein wird.

Das ist, was ich jetzt haben:

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): 
     ... 
    ... 

Dies ist jedoch nicht gerade jetzt etwas zu tun zu sein scheint. Wenn Sie 'Q' drücken, wird das Fenster nicht geschlossen, und ich kann nicht wirklich sagen, ob die Eingabetaste funktioniert oder nicht.

ich auf diese Frage sah vorher: PyQt Connect to KeyPressEvent

ich auch die gesamte Dokumentation auf Sourceprüft. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Sie können zwei Wege gehen und man ist einfach KeyPressevent ohne jede schicke Arbeit zu implementieren. Gefallen Sie diese

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() 

Oder wie Sie versuchte, mit Signalen, in Ihrem Fall, dass Sie, wo fehlen dieses Signal richtig zu implementieren, ist hier aktualisierte Version.

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() 
+0

Danke für die Antwort! Ich habe beide Wege ausprobiert und leider arbeiten beide nicht für mich. Ich werde weiter damit herumspielen und ich werde kommentieren, wenn etwas funktioniert –

+0

Das sollte funktionieren, das ist das minimale Beispiel, das ich anbieten kann .. viel Glück :) – Achayan

0

Für Achayans Antwort gelang es mir mit dem Code. Es kann die Enter-Taste und die Return-Taste sein. Versuchen Sie Key_Enter und Key_Return. Sie sind auf meiner Tastatur anders.