gpt4 book ai didi

python - 当文本框具有焦点时,Windows 上 Qt 的 Ctrl+Alt 键修饰符行为

转载 作者:可可西里 更新时间:2023-11-01 10:38:59 33 4
gpt4 key购买 nike

我做了一个快速示例程序来演示这个问题

import sys

from PyQt4 import QtGui
from PyQt4.QtCore import Qt

class AWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(AWindow, self).__init__(parent=parent)

self.setCentralWidget(QtGui.QWidget())
self.centralWidget().setLayout(QtGui.QFormLayout())

self.centralWidget().layout().addRow(
QtGui.QLabel('some text'),
QtGui.QLineEdit()
)
self.centralWidget().layout().addRow(
QtGui.QLabel('some text'),
QtGui.QCheckBox('this is checkbox')
)

def keyPressEvent(self, e):
if int(e.modifiers()) == (Qt.ControlModifier+Qt.AltModifier):
if e.key() == Qt.Key_K:
#when ctrl+alt+k is pressed, a message box should open
msg = QtGui.QMessageBox(
QtGui.QMessageBox.Information,
'w00t',
'You pressed ctrl+alt+k'
)
msg.exec_()
def main():
app = QtGui.QApplication(sys.argv)
w = AWindow()
w.show()
sys.exit(app.exec_())

if __name__ == '__main__':
main()

问题

在此示例中,我捕获了 ctrl+alt+k 键盘快捷键。问题在于,如果在按下这些键时文本输入小部件具有键盘焦点,则 keyPressEevent 处理程序不会捕获它,而是将大写字母 K 键入框中。 (这与所有 ctrl+alt 按键相同)。

如果另一种小部件获得焦点,即不接受文本输入的小部件(例如复选框、按钮),则按应有的方式注册按键,并在示例中显示消息框。
此外,仅使用 Ctrl 修饰符的键盘快捷键也能正常工作。

这个问题只在 Windows 上出现,但在 Linux 上不会出现,所以这让我相信这与 Windows 处理 ctrl+alt 修饰符的方式有关,或者我没有正确捕获修饰符。

有什么办法可以解决这个问题吗?

编辑

我从蜘蛛侠的评论中得出了这个解决方案。
我将 QLineEdit 分类并像这样处理它的 keyPressEvent。

#EDIT: this doesn't work, see below
def keyPressEvent(self, e):
if e.modifiers() and Qt.ControlModifier and Qt.AltModifier:
e.ignore()
super(CoolLineEdit, self).keyPressEvent(e)

重新编辑

将修饰符加起来作为整数并在 e.ignore() 之后返回(也许不需要忽略)似乎非常重要。
这是真正的解决方法。

def keyPressEvent(self, e):
if int(e.modifiers()) == (QtCore.Qt.ControlModifier+QtCore.Qt.AltModifier):
e.ignore()
return
super(SaveLineEdit, self).keyPressEvent(e)

最佳答案

QLineEdit , 当它有焦点时,正在处理 `QKeyEvent .如果您需要在 Windows 上使用此功能,我建议:

1) 从 QLineEdit 派生一个类(或您想要的任何 QTextEdit 派生类)。

2) 覆盖 virtual void keyPressEvent(QKeyEvent* e)并检查您的特定组合键。

3) 如果你找到它,不处理它就返回,它会落到下一层(你的窗口,它会捕获它并打印你的消息)。

4) 如果没有找到,显式调用函数的基类版本:BaseClass::keyPressEvent(e);以便正确处理正常的按键操作。

对不起,我没有使用过 PyQt 的 C++ 语法。

关于python - 当文本框具有焦点时,Windows 上 Qt 的 Ctrl+Alt 键修饰符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9490453/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com