Python 在QWidget中实现keyPressEvent

Python 在QWidget中实现keyPressEvent,python,event-handling,pyqt,keypress,Python,Event Handling,Pyqt,Keypress,我有一个带有“继续”按钮的QDialog窗口。“继续”按钮是默认按钮,因为每当我按下enter键时,都会按下“继续”按钮。我发现了一些奇怪的事情:当我按三次回车键时,继续按钮按了三次。然而,当我第四次按下它时,整个窗口关闭。我在关闭窗口的“继续”按钮的正下方有一个“取消”按钮,但我没有将“取消”按钮设置为默认按钮或其他任何按钮 我想覆盖keyPressEvent,这样每当我在窗口中时,enter按钮将始终连接到continue按钮 这就是我现在拥有的: class ManualBalanceUI

我有一个带有“继续”按钮的QDialog窗口。“继续”按钮是默认按钮,因为每当我按下enter键时,都会按下“继续”按钮。我发现了一些奇怪的事情:当我按三次回车键时,继续按钮按了三次。然而,当我第四次按下它时,整个窗口关闭。我在关闭窗口的“继续”按钮的正下方有一个“取消”按钮,但我没有将“取消”按钮设置为默认按钮或其他任何按钮

我想覆盖
keyPressEvent
,这样每当我在窗口中时,enter按钮将始终连接到continue按钮

这就是我现在拥有的:

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):
         ...
     ...
然而,现在看来这并没有起到任何作用。按“Q”键不会关闭窗口,而且我也无法真正判断“回车”键是否起作用

我事先看了这个问题:


我还查看了SourceForge的所有文档。任何帮助都将不胜感激

你可以用两种方法,一种是不做任何花哨的工作,简单地重新实现keyPressevent。像这样

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()
或者,当您尝试使用信号时,在您的情况下,您缺少正确实现此信号的地方,这里是更新版本

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

对于阿卡扬的回答,我成功地使用了密码。 它可能是回车键和回车键。 尝试按Enter键和Return键。它们在我的键盘上是不同的

QtCore.QObject.connect(self.ui.search_box, QtCore.SIGNAL("textChanged()"), self.fucn1)
每当在
搜索框
中更改文本时,就会调用函数
fucn1

适用于pyqt4

如果您在2019年看到这一点,并且如果Achayan的方法不适用于您,请检查以下几点:

1) 按键事件是否在主窗口或主窗口小部件的子窗口中被覆盖?子函数将重写父函数上的方法(至少在使用带有setCentralWidget的QMainWindow时)。如果是这种情况,那么信号可能不会像您预期的那样发出

2) 您是否有一个与QWidget不同的小部件来处理关键输入?例如,如果焦点位于QTextEdit对象中,则按键输入将不会发送到keyPressEvent。将焦点转移到另一个

例如,观察以下各项的输出:

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)
pressed from myDialog:  48