PyQt 无法识别箭头键

2023-12-28

我正在尝试编写一个(目前非常)简单的 PyQt 应用程序,并希望允许用户使用箭头键进行导航,而不是单击按钮。

我已经实现了基础知识,并且在我的主要内容中QWidget,我覆盖keyPressEvent,现在,我所要求的就是它发出警报(QMessageBox.information(self, "Hey", "pressed:{}".format(event), QMessageBox.Ok)).

这对于标准 ASCII 键(例如字母和 Enter 键)来说非常有效,但是当我按下箭头键时它完全被忽略,而且我一生都无法弄清楚为什么。

我心里想知道键盘是否还有其他问题,因为我使用的笔记本电脑没有数字键盘(它是带有标准常规 ASCII 键盘的 HP 键盘,四个箭头键楔入右 Shift 下方,并且没有数字键盘)。

有什么建议或帮助吗?如果需要的话我可以发布代码,但是由于keyPressEvent适用于所有其他键,我不确定它会添加什么。


如果您不想将子窗口部件集中在任何东西上。如果你只想要主QWidget,制定儿童无焦点政策;

例如,希望是有帮助的;

import sys
from PyQt4 import QtGui, QtCore

class QCustomWidget (QtGui.QWidget):
    def __init__ (self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        myQLayout = QtGui.QVBoxLayout()
        self.my1QPushButton = QtGui.QPushButton('Test 1', self)
        self.my2QPushButton = QtGui.QPushButton('Test 2', self)
        self.setChildrenFocusPolicy(QtCore.Qt.NoFocus)
        myQLayout.addWidget(self.my1QPushButton)
        myQLayout.addWidget(self.my2QPushButton)
        self.setLayout(myQLayout)

    def setChildrenFocusPolicy (self, policy):
        def recursiveSetChildFocusPolicy (parentQWidget):
            for childQWidget in parentQWidget.findChildren(QtGui.QWidget):
                childQWidget.setFocusPolicy(policy)
                recursiveSetChildFocusPolicy(childQWidget)
        recursiveSetChildFocusPolicy(self)

    def keyPressEvent (self, eventQKeyEvent):
        messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Main', QtGui.QMessageBox.Yes)
        messageQMessageBox.exec_()
        QtGui.QWidget.keyPressEvent(self, eventQKeyEvent)

appQApplication = QtGui.QApplication(sys.argv)
windowQCustomWidget = QCustomWidget()
windowQCustomWidget.setFixedSize(640, 480)
windowQCustomWidget.show()
sys.exit(appQApplication.exec_())

QWidget.setFocusPolicy(self, Qt.FocusPolicy 策略) 参考 http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#setFocusPolicy

FocusPolicy 枚举参考 http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#FocusPolicy-enum


小部件中的当前光标,按下按键后有效。

案例1:纯QWidget:这种情况下它可以跟踪所有按键,因为焦点是自我QWidget.

import sys
from PyQt4 import QtGui, QtCore

class QCustomWidget (QtGui.QWidget):
    def __init__ (self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        myQLayout = QtGui.QVBoxLayout()
        self.setLayout(myQLayout)

    def keyPressEvent (self, eventQKeyEvent):
        messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello', QtGui.QMessageBox.Yes)
        messageQMessageBox.exec_()
        QtGui.QWidget.keyPressEvent(self, eventQKeyEvent)

appQApplication = QtGui.QApplication(sys.argv)
windowQCustomWidget = QCustomWidget()
windowQCustomWidget.setFixedSize(640, 480)
windowQCustomWidget.show()
sys.exit(appQApplication.exec_())

案例2:添加按钮QWidget:这种情况无法跟踪箭头键,因为它的焦点按钮和箭头键已通过设置新的焦点位置使用。 (如果您在 Linux 中使用 Windows 风格,您可以看到焦点网格线)

import sys
from PyQt4 import QtGui, QtCore

class QCustomWidget (QtGui.QWidget):
    def __init__ (self, parent = None):
        super(QCustomWidget, self).__init__(parent)
        myQLayout = QtGui.QVBoxLayout()
        self.my1QPushButton = QtGui.QPushButton('Test 1', self)
        self.my2QPushButton = QtGui.QPushButton('Test 2', self)
        myQLayout.addWidget(self.my1QPushButton)
        myQLayout.addWidget(self.my2QPushButton)
        self.my1QPushButton.keyPressEvent = self.button1KeyPressEvent
        self.my2QPushButton.keyPressEvent = self.button2KeyPressEvent
        self.setLayout(myQLayout)

    def keyPressEvent (self, eventQKeyEvent):
        messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Main', QtGui.QMessageBox.Yes)
        messageQMessageBox.exec_()
        QtGui.QWidget.keyPressEvent(self, eventQKeyEvent)

    def button1KeyPressEvent (self, eventQKeyEvent):
        messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Button 1', QtGui.QMessageBox.Yes)
        messageQMessageBox.exec_()
        QtGui.QPushButton.keyPressEvent(self.my1QPushButton, eventQKeyEvent)

    def button2KeyPressEvent (self, eventQKeyEvent):
        messageQMessageBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Question', 'Hello Button 2', QtGui.QMessageBox.Yes)
        messageQMessageBox.exec_()
        QtGui.QPushButton.keyPressEvent(self.my2QPushButton, eventQKeyEvent)

appQApplication = QtGui.QApplication(sys.argv)
windowQCustomWidget = QCustomWidget()
windowQCustomWidget.setFixedSize(640, 480)
windowQCustomWidget.show()
sys.exit(appQApplication.exec_())

我不知道 PyQt 返回的箭头键的 ASCII 是什么,但你可以避免这种情况。在 pyQt 中有 ENUMQtCore.Qt.Key,你可以阅读类参考资料;

Example:

def keyPressEvent (self, eventQKeyEvent):
    key = eventQKeyEvent.key()
    if key == QtCore.Qt.Key_F1:
        print 'Help'
    elif key == QtCore.Qt.Key_F5:
        print 'Reload'
    elif key == QtCore.Qt.Key_Left:
        print 'Left'
    elif key == QtCore.Qt.Key_Up:
        print 'Up'
    elif key == QtCore.Qt.Key_Right:
        print 'Right'
    elif key == QtCore.Qt.Key_Down:
        print 'Down'

也可以看看:Qt.Key ENUM 参考 http://pyqt.sourceforge.net/Docs/PyQt4/qt.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt 无法识别箭头键 的相关文章

随机推荐

  • 为我的 MVC 应用程序创建服务层?

    据我了解 MVC 通过控制器这一 粘合剂 将类定义 模型 与表示 视图 分开 控制器应该有单一的职责 因此是可测试的 ViewModel 用于将来自多个实体的数据汇集在一起 并 按摩 来自视图控制器的数据 似乎业务逻辑并没有真正占有一席之地
  • 父 MOC 从子 MOC 获取空数据的更改

    我陷入了 CoreData 和父子 MOC 的这个问题 将对象添加到子 MOC 保存它们并保存父 MOC 时 所有对象的属性都会重置为 defaultValue 我在此处粘贴了两个 MOC 的日志 特别是这些日志中重置的 stringAtt
  • 如何为 Hanami 应用程序配置 Puma?

    我有一个 Hanami 1 3 3 应用程序 它应该与 Puma 作为生产网络服务器一起运行 我想在集群模式下使用 puma 并正确使用 preload app 现在我正在努力寻找正确的 Puma 配置 我知道 每个子进程 工作进程 都必须
  • 如何检测未使用的宏定义和 typedef?

    通过链接器反馈很容易获得未使用的函数和变量的列表 但如何检测这些未使用的宏定义和 typedef 我必须在整个项目中逐行浏览代码和 git grep 吗 对于源文件中定义的宏 您可以尝试 Wunused macrosgcc clang 标志
  • 选择排序从两端开始增长有序范围

    我编写了选择排序的修改版本 其中我考虑数组的最小值和最大值并将它们放在两端 该算法的工作原理如下 1 Find the minimum and the maximum value in the list 2 Swap the minimum
  • PHP串口数据从Arduino返回

    我想知道是否有一种方法可以通过 PHP 读取我的串行端口 有效 在练习 Arduino 技能时 我开发了一个简单的 LED 开 关草图 它的工作原理是输入on or off在串行监视器中 下一步 我整理了一个网页作为 GUI 界面 用于单击
  • 预期响应为 <:redirect>,但实际响应为 <200>

    我的 rspec 测试遇到问题 浏览了之前的问题后我无法解决它 测试失败并出现上述错误 但代码在实践中有效 有谁知道如何解决这个问题 Rspec describe authentication of edit update pages do
  • 请求运行时权限时出现java.lang.StackOverflowError

    我创建了一个公共类PermissionManager为了从一个地方管理所有权限 通常它工作正常 但上传后它显示崩溃分析的错误报告我无法重现 详细信息如下所述 Fatal Exception java lang StackOverflowEr
  • 无法关闭 Matplotlib 中的科学计数法[重复]

    这个问题在这里已经有答案了 我使用以下代码在 Matplotlib Python 中绘制一个简单的图 temp np array 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 99999999 0 99999999 0 999
  • 多个 Eclipse IDE 应用程序未显示在 Launchpad 上

    我需要有关 Launchpad 上 Eclipse IDE 的帮助 我有 Mac OS X Yosemite 并且下载了 Eclipse IDE Java PHP 和 C C 在我提取 Eclipse IDE Java 并将其拖放到我的应用
  • 无法使用 VS 2022 调试 WSL2 - 无效的“cwd”值

    我尝试在 Windows 中使用 VS 2022 IDE 从 WSL2 进行调试 但出现以下错误 cwd 值确实看起来错误 但如何修复它 我正在使用 netcore 6 0 101 Ubuntu 20 04 3 和 Windows 11 启
  • 垂直对齐在内联块中不起作用

    我想将文本垂直居中 但是 这行不通 当我将文本放入内联块中时 我应该能够将文本垂直居中 对吧 为什么这段代码不起作用 我怎样才能使它起作用 请帮帮我 先感谢您 HTML ul class socialBlock li class socia
  • 通过点击单元格内的图像从 UITableViewCell 中转出

    我已经尝试解决这个问题有一段时间了 经过几个小时的寻找解决方案后 我决定是时候问了 我有一个由自定义 UITableViewCells 填充的表格视图 当前当您点击单元格时 它会将您带到详细视图 自定义单元格内有一个图像 我希望用户能够点击
  • ListView 显示字符串时出现问题

    任何人都可以帮助我在我的应用程序中以列表视图显示一组结果 我得到以下内容 codeList
  • 模拟挂起 lambda 在 Mockito 中返回 null

    依赖关系 testImplementation androidx arch core core testing 2 0 0 testImplementation org mockito mockito core 3 3 0 testImpl
  • 回合制多人骷髅演示应用程序

    我正在尝试让基于回合制多人游戏的演示应用程序正常工作 但遇到了问题 我已经编译并运行了代码 但每当我尝试实际连接或创建游戏时 都会收到此错误 DrawingActivity 13235 没有警告或字符串要处理 6003 该错误代码对应于此
  • 确定 CRAN 上 R 包历史版本的数量

    是否可以确定 CRAN 上的某个包过去拥有的版本数 这是一个使用XML包裹 这只是计算存档版本 更准确地说 是存档版本的数量 tar gz文件 加 1 即可得到版本总数 包括当前版本 nCRANArchived lt function pk
  • 使用相同的方法签名发布和获取

    在我的控制器中 我有两个名为 朋友 的操作 执行哪个取决于它是 get 还是 post 所以我的代码片段看起来像这样 Get AcceptVerbs HttpVerbs Get public ActionResult Friends do
  • PHP 是否有等效的forever.js 来连续运行我的脚本?

    我偶尔使用永远 js https github com nodejitsu forever用于将 CLI 类型的 Node js 应用程序快速而肮脏地部署到我不希望完全启动的生产环境中监督者 http supervisord org 部署
  • PyQt 无法识别箭头键

    我正在尝试编写一个 目前非常 简单的 PyQt 应用程序 并希望允许用户使用箭头键进行导航 而不是单击按钮 我已经实现了基础知识 并且在我的主要内容中QWidget 我覆盖keyPressEvent 现在 我所要求的就是它发出警报 QMes