【问题标题】:Implementing keyPressEvent in QWidget在 QWidget 中实现 keyPressEvent
【发布时间】:2016-11-25 05:02:44
【问题描述】:

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

我想覆盖keyPressEvent,这样每当我在窗口中时,输入按钮将始终连接到继续按钮。

这就是我现在拥有的:

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”不会关闭窗口,我也无法确定“回车”键是否有效。

我之前看过这个问题:PyQt Connect to KeyPressEvent

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

【问题讨论】:

    标签: python event-handling pyqt keypress


    【解决方案1】:

    你可以做两种方式,一种是简单地重新实现 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()
    

    【讨论】:

    • 感谢您的回答!我尝试了两种方法,不幸的是它们都不适合我。我会继续玩它,如果有什么可行的,我会发表评论
    • 应该可以,这是我可以提供的可能的最小示例。祝你好运:)
    【解决方案2】:

    如果您在 2019 年看到这个,并且如果 Achayan 的方法对您不起作用,那么请检查几件事:

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

    2) 你有一个小部件,它处理键输入的方式与 QWidget 不同吗?例如,如果焦点在 QTextEdit 对象中,那么键输入将不会发送到 keyPressEvent。将焦点转移到另一个widget

    例如,观察以下输出:

    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
    

    【讨论】:

      【解决方案3】:

      对于 Achayan 的回答,我成功使用了代码。 它可能是回车键和回车键。 尝试 Key_Enter 和 Key_Return。它们在我的键盘上是不同的。

      【讨论】:

        【解决方案4】:
        QtCore.QObject.connect(self.ui.search_box, QtCore.SIGNAL("textChanged()"), self.fucn1)
        

        每当search_box 中的文本发生更改时,都会调用函数fucn1。 适用于 pyqt4

        【讨论】:

          猜你喜欢
          • 2011-02-13
          • 2011-12-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多