Qwidget的按键事件不工作?

2024-04-25 00:58:58 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我按任何键,什么也不会发生。如何实施?我注意到,如果我按了某个键(第一次/非常乞讨/第一个字符),在文本框中显示被按下的字符需要更多的时间。如何解决

from PyQt5 import QtWidgets,QtCore,QtGui

class MyKey(QtWidgets.QWidget):
    def __init__(self):
        super(). __init__()
        self.setWindowTitle(" My Key Board")
        self.ui()

    def ui(self):
        self.tb = QtWidgets.QLineEdit()
        self.vb = QtWidgets.QVBoxLayout()
        self.vb.addWidget(self.tb)
        self.setLayout(self.vb)

    def keyPressEvent(self, e):
        print("key pressed")
        print(e.key())
        if type(e) == QtGui.QKeyEvent:
            if e.key() == QtCore.Qt.Key_A:
                print("ypu pressed 'A'")


if __name__ == "__main__":
    import sys
    myapp = QtWidgets.QApplication(sys.argv)
    mywindow = MyKey()
    mywindow.show()
    sys.exit(myapp.exec_())

1条回答
网友
1楼 · 发布于 2024-04-25 00:58:58

在Qt中,KeyPressEvent仅发送到具有焦点的小部件,如果它使用了焦点,则事件不会发送到父小部件,否则也会通知父小部件

在本例中,QLineEdit是具有焦点并使用具有文本、数字和一些特殊键的事件的小部件,因此在这些情况下不会通知父小部件。QLineEdit没有使用其他键,例如父窗口小部件接收到的F2Escape

如果您想收听一个特殊的键或键的组合,则必须使用QShortcut但是因为OP想要监听所有事件,所以一个可能的解决方案是在与窗口相关联的QWindow上安装一个eventfilter,如果它在窗口具有焦点时接收到键盘事件,则不管哪个小部件具有焦点

from PyQt5 import QtWidgets, QtCore, QtGui


class MyKey(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle(" My Key Board")
        self.ui()

    def ui(self):
        self.tb = QtWidgets.QLineEdit()

        vb = QtWidgets.QVBoxLayout(self)
        vb.addWidget(self.tb)

    def handle_key_press(self, key, text):
        if key == QtCore.Qt.Key_A:
            print("ypu pressed 'A'")


class KeyHelper(QtCore.QObject):
    key_pressed = QtCore.pyqtSignal(int, str)

    def __init__(self, window):
        super().__init__(window)
        self._window = window
        self.window.installEventFilter(self)

    @property
    def window(self):
        return self._window

    def eventFilter(self, obj, event):
        if obj is self._window and event.type() == QtCore.QEvent.KeyPress:
            self.key_pressed.emit(event.key(), event.text())
        return super().eventFilter(obj, event)


if __name__ == "__main__":
    import sys

    myapp = QtWidgets.QApplication(sys.argv)

    mywindow = MyKey()
    mywindow.show()

    helper = KeyHelper(mywindow.windowHandle())
    helper.key_pressed.connect(mywindow.handle_key_press)

    sys.exit(myapp.exec_())

相关问题 更多 >