【发布时间】: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 窗口管理器),但我无法重现该行为。请编辑您的问题并添加有关您正在测试的特定平台(包括桌面环境)的详细信息。您在后台运行的某些程序是否会窃取击键或弄乱键盘焦点?