jjzjj

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

coder 2024-06-13 原文

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

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/

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

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  6. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  7. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

随机推荐