释放按钮后调用的 keyPressEvent

Posted

技术标签:

【中文标题】释放按钮后调用的 keyPressEvent【英文标题】:keyPressEvent called after the button is released 【发布时间】:2019-07-24 10:06:51 【问题描述】:

我尝试在按下 Ctrl 按钮时更改光标图标。问题是,如果您按住按钮,则不会调用 keyPressEvent 方法。如果您同时按下两个按钮,例如Ctrl+Shift,然后按预期工作。

测试环境:系统SUSE 12.2、python 3.6.4、pyqt5 5.11.3(也测试过pyqt5 5.9.2)。

这是一个最小(不)工作的例子:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from PyQt5.QtWidgets import QApplication, QWidget


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 300, 220)
        self.show()

    def keyPressEvent(self, event):
        print('Press')

    def keyReleaseEvent(self, event):
        print('Release')

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

按住 Ctrl 按钮后,应打印“Press”。但是,直到您释放按钮或同时单击另一个按钮时才会这样做。

我注意到不同键的不同行为。左右 Ctrl 的行为相同,左边的 Shift 也一样,但右边的 Shift 的行为符合需要。

【问题讨论】:

在 Linux 上使用 PyQt5 5.13,当我按下 Ctrl 时会打印“Press” 我将尝试 PyQt5 5.13,由于一些 libdbus-1.so.3 重定位错误,我现在无法尝试。 在 Windows 上使用 PyQt5.9.1 和 py3.6.3 测试:它按预期打印“Press”和“Release”。我想知道这是否只是由于print 中的缓冲 - 也许尝试添加flush=True。或者如果打印只是为了演示,请忽略它。 如果只是缓冲,那么至少 QApplication.setOverrideCursor 会按预期工作。然而事实并非如此。也许问题是系统 QT 版本,我已经很旧了(5.6.1)。不知道,pyQT5对系统QT5的依赖程度。 @DavidSery PyQt 100% 依赖于 Qt,因为它只是其库的一个薄包装。无论如何,我在 linux 上使用 pyqt-5.6/qt-5.6 和 pyqt-5.13/qt-5.13 进行了测试(使用 openbox 窗口管理器),但我无法重现该行为。请编辑您的问题并添加有关您正在测试的特定平台(包括桌面环境)的详细信息。您在后台运行的某些程序是否会窃取击键或弄乱键盘焦点? 【参考方案1】:
def keyPressEvent(self, event):
    print('Press')
    QApplication.setOverrideCursor(Qt.WaitCursor)

def keyReleaseEvent(self, event):
    print('Release')
    QApplication.restoreOverrideCursor()

【讨论】:

看来你没看懂问题,OP表示keyPressEvent是在松开Ctrl键后才调用的,但是在你按那个键的时候调用keyPressEvent是正常的。 问题不在于我不知道如何更改光标,而是在释放按钮或按下第二个按钮之前不会调用信号。我还是要测试一个新的 PyQT5 版本,也许这就是问题所在。 对我来说,keyPressEvent 函数在我按下按钮时被调用,keyReleaseEvent 在我释放时被调用。

以上是关于释放按钮后调用的 keyPressEvent的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮后立即执行 SwiftUI 按钮操作,而不是单击释放

Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。

Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。

Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。

Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。

Unreal UMG按钮的按住,长时间会自动调用Release释放按钮。