释放按钮后调用的 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释放按钮。