Skip to content Skip to sidebar Skip to footer

Implementing Keypressevent In Qwidget

I have a QDialog window that has a continue button. The continue button is the default button because whenever I press the enter key, the continue button is pressed. I discovered s

Solution 1:

You can do two ways and one is simply re implement keyPressevent with out any fancy work. Like this

from PyQt4 import QtCore, QtGui
import sys

classExample(QtGui.QWidget):
    def__init__(self):
        super(Example, self).__init__()
        self.setGeometry(300, 300, 250, 150)
        self.show()

    defkeyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Q:
            print"Killing"
            self.deleteLater()
        elif event.key() == QtCore.Qt.Key_Enter:
            self.proceed()
        event.accept()

    defproceed(self):
        print"Call Enter Key"defmain():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Or as you tried with signals, in your case you where missing to implement this signal properly, here is updated version.

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

    defkeyPressEvent(self, event):
        super(Example, self).keyPressEvent(event)
        self.keyPressed.emit(event) 

    defon_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 pressedelif event.key() == QtCore.Qt.Key_Q:
            print"Killing"
            self.deleteLater()  # a test I implemented to see if pressing 'Q' would close the windowdefproceed(self):
        print"Call Enter Key"defmain():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Solution 2:

If you're looking at this in 2019, and If Achayan's method does not work for you then check a couple things :

1) Is the keyPressEvent overridden in a child of the main window or main widget? The child's function will override the methods on the parent (at least when using a QMainWindow with setCentralWidget). If this is the case, then the signal might not be emitted like you expect

2) Do you have a widget that handles key inputs differently than QWidget? For example, if the focus is in a QTextEdit object, then key inputs will not be sent to keyPressEvent. Shift focus to another widget

For example, observe the output of the following :

class myDialog(QtWidgets.QDialog):
    keyPressed = QtCore.pyqtSignal(QtCore.QEvent)

    def __init__(self, parent=None):
        super(myDialog, self).__init__(parent)
        self.keyPressed.connect(self.on_key)

        leftGroupBox = QtWidgets.QGroupBox('A Group Label')
        text = QtWidgets.QTextEdit('Enter some text')
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(text)
        leftGroupBox.setLayout(layout)

        rightGroupBox = QtWidgets.QGroupBox('Label Options')
        label1 = QtWidgets.QCheckBox('ahu')
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(label1)
        rightGroupBox.setLayout(layout)

        # Create the main layout
        mainLayout = QtWidgets.QGridLayout()
        mainLayout.addWidget(leftGroupBox)
        mainLayout.addWidget(rightGroupBox)
        self.setLayout(mainLayout)

    def keyPressEvent(self, event):
        # keyPressEvent defined in child
        print('pressed from myDialog: ', event.key())
#        self.keyPressed.emit(event) # Emit is hidden in child

    def on_key(self, event):
        print('event received @ myDialog')
        if event.key() == QtCore.Qt.Key_0:
            print(0)

class MainWindow(QtWidgets.QMainWindow):
    keyPressed = QtCore.pyqtSignal(QtCore.QEvent)

    def __init__(self):
        super(MainWindow, self).__init__()
        self.keyPressed.connect(self.on_key)
        self.setCentralWidget(myDialog())
        self.show()

    def keyPressEvent(self, event):
        super(MainWindow, self).keyPressEvent(event)
        print('pressed from MainWindow: ', event.key())
        self.keyPressed.emit(event)


    def on_key(self, event):
        print('event received @ MainWindow')
        if event.key() == QtCore.Qt.Key_0:
            print(0)

if __name__ == '__main__':
    ex = MainWindow()
Output @ console : (no event is received @myDialog OR MainWindow)
pressedfrommyDialog:  48

Solution 3:

For Achayan's answer, I succeeded with the code. It may be the enter key and the return key. Try Key_Enter and Key_Return. They are different on my keyboard.

Post a Comment for "Implementing Keypressevent In Qwidget"