在 PyQT5 中按下某些快捷键序列不会触发快捷方式
Certain shortcut key-sequences don't trigger shortcuts when pressed in PyQT5
这里有一些代码可以重现我的 'error' 可以这么说:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import (QShortcut, QTextEdit, QApplication)
app = QApplication([])
wid = QTextEdit()
wid.show()
short = QShortcut(QKeySequence(Qt.Key_F2), wid)
short.activated.connect(sys.exit)
app.exec()
如预期的那样,按 F2 会关闭程序。如果我使用其他键作为参数,例如 QKeySequence(Qt.Key_Control)
或 QKeySequence(Qt.Key_Control + Qt.Key_F2)
,当我在启动程序时按下所述键时没有任何反应
我似乎无法弄清楚是什么阻止了他们触发快捷方式。从我阅读过的关于快捷方式的其他 SO 线程的阅读中,有些人说有问题的小部件可能没有得到关注。我已确定我的小部件已聚焦,但尽管如此,当我使用此类键时快捷方式不会触发
有些人说小部件的子 keyPressEvent 可能会占用快捷方式。这让我很困惑。我确实浏览了文档,而 shortcutEvents 恰好是他们自己独特的个人事件。我不明白为什么小部件的 keyPressEvent 处理程序可能会选择处理传递给它的 shortcutEvent
我相信这与我为快捷方式本身指定的键有关,但我不能完全确定。当然,只使用 F2 作为快捷方式是一个选项,但我真的很想允许按下 Shift + F2 或 Control + F2 作为快捷方式,但由于某些奇怪的原因它不起作用
将部分键序列更改为 Qt.CTRL
对我有用;所以序列中的 Qt.Key_Control
可能有问题。Qt.SHIFT
似乎不适用于 QTextEdit
或 QLineEdit
但适用于其他小部件。也许使用 QWidget
作为容器并在其上使用键序列而不是单独使用 QTextEdit
小部件。除此以外;子类 QTextEdit
并覆盖 keyPressEvent
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import (QShortcut, QWidget, QGridLayout, QTextEdit, QApplication)
app = QApplication([])
wid = QWidget()
layout=QGridLayout(wid)
tEdit=QTextEdit()
layout.addWidget(tEdit)
wid.show()
short = QShortcut(QKeySequence(Qt.SHIFT+Qt.Key_P), wid)
#short = QShortcut(QKeySequence(Qt.CTRL+Qt.Key_F2), wid)
#short = QShortcut(QKeySequence(Qt.SHIFT+Qt.Key_1), wid) - doesnt work on textedit/lineedit but works on other widgets
short.activated.connect(sys.exit)
wid.setFocus() #simulate focus on widget
app.exec()
首先,可以用字符串创建快捷方式:
short = QShortcut(QKeySequence('ctrl+f2'), wid)
也就是说,我相信您不了解键盘修饰符是什么以及 UI 交互是如何工作的。
在您提出的评论中:“仅包含 Qt.CTRL
的键序列似乎不起作用”。
Shift、Alt和Ctrl是modifier keys,其中UI 环境不是可以自行触发任何事情的键。他们修改其他键的行为。
最重要的是,所有这些键在接受用户输入(尤其是文本)的小部件中非常重要,但它不使用 basic 小部件目的可能需要的键触发操作没有多大意义(如果用户只想进行剪贴板操作并且您触发退出Ctrl?).
然后您还会问“为什么 JUST 1 作为快捷方式不起作用?”。
与上面的概念相同:“1”是一个 type-able 字符,为什么要阻止写入 1 并以此退出程序?
键盘快捷键应该几乎总是基于修饰符和字母键的键盘组合,唯一的例外是功能键和特殊键,它们可以在不涉及文本输入的情况下安全触发。
注意:除非您知道自己在做什么,否则不要在 Qt 信号或相关函数中使用 sys.exit
。使用 QApplication.quit
.
这里有一些代码可以重现我的 'error' 可以这么说:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import (QShortcut, QTextEdit, QApplication)
app = QApplication([])
wid = QTextEdit()
wid.show()
short = QShortcut(QKeySequence(Qt.Key_F2), wid)
short.activated.connect(sys.exit)
app.exec()
如预期的那样,按 F2 会关闭程序。如果我使用其他键作为参数,例如 QKeySequence(Qt.Key_Control)
或 QKeySequence(Qt.Key_Control + Qt.Key_F2)
,当我在启动程序时按下所述键时没有任何反应
我似乎无法弄清楚是什么阻止了他们触发快捷方式。从我阅读过的关于快捷方式的其他 SO 线程的阅读中,有些人说有问题的小部件可能没有得到关注。我已确定我的小部件已聚焦,但尽管如此,当我使用此类键时快捷方式不会触发
有些人说小部件的子 keyPressEvent 可能会占用快捷方式。这让我很困惑。我确实浏览了文档,而 shortcutEvents 恰好是他们自己独特的个人事件。我不明白为什么小部件的 keyPressEvent 处理程序可能会选择处理传递给它的 shortcutEvent
我相信这与我为快捷方式本身指定的键有关,但我不能完全确定。当然,只使用 F2 作为快捷方式是一个选项,但我真的很想允许按下 Shift + F2 或 Control + F2 作为快捷方式,但由于某些奇怪的原因它不起作用
将部分键序列更改为 Qt.CTRL
对我有用;所以序列中的 Qt.Key_Control
可能有问题。Qt.SHIFT
似乎不适用于 QTextEdit
或 QLineEdit
但适用于其他小部件。也许使用 QWidget
作为容器并在其上使用键序列而不是单独使用 QTextEdit
小部件。除此以外;子类 QTextEdit
并覆盖 keyPressEvent
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import (QShortcut, QWidget, QGridLayout, QTextEdit, QApplication)
app = QApplication([])
wid = QWidget()
layout=QGridLayout(wid)
tEdit=QTextEdit()
layout.addWidget(tEdit)
wid.show()
short = QShortcut(QKeySequence(Qt.SHIFT+Qt.Key_P), wid)
#short = QShortcut(QKeySequence(Qt.CTRL+Qt.Key_F2), wid)
#short = QShortcut(QKeySequence(Qt.SHIFT+Qt.Key_1), wid) - doesnt work on textedit/lineedit but works on other widgets
short.activated.connect(sys.exit)
wid.setFocus() #simulate focus on widget
app.exec()
首先,可以用字符串创建快捷方式:
short = QShortcut(QKeySequence('ctrl+f2'), wid)
也就是说,我相信您不了解键盘修饰符是什么以及 UI 交互是如何工作的。
在您提出的评论中:“仅包含 Qt.CTRL
的键序列似乎不起作用”。
Shift、Alt和Ctrl是modifier keys,其中UI 环境不是可以自行触发任何事情的键。他们修改其他键的行为。
最重要的是,所有这些键在接受用户输入(尤其是文本)的小部件中非常重要,但它不使用 basic 小部件目的可能需要的键触发操作没有多大意义(如果用户只想进行剪贴板操作并且您触发退出Ctrl?).
然后您还会问“为什么 JUST 1 作为快捷方式不起作用?”。
与上面的概念相同:“1”是一个 type-able 字符,为什么要阻止写入 1 并以此退出程序?
键盘快捷键应该几乎总是基于修饰符和字母键的键盘组合,唯一的例外是功能键和特殊键,它们可以在不涉及文本输入的情况下安全触发。
注意:除非您知道自己在做什么,否则不要在 Qt 信号或相关函数中使用 sys.exit
。使用 QApplication.quit
.