在 QWidget 中实现 keyPressEvent

2024-03-08

我有一个带有继续按钮的 QDialog 窗口。继续按钮是默认按钮,因为每当我按下回车键时,就会按下继续按钮。我发现了一些奇怪的事情:当我按三下回车键时,继续按钮按了三下。然而,当我第四次按下它时,整个窗口都会关闭。我在关闭窗口的继续按钮正下方有一个取消按钮,但我没有将取消按钮设置为默认按钮或其他任何按钮。

我想覆盖keyPressEvent这样每当我在窗口中时,输入按钮将始终连接到继续按钮。

这就是我现在所拥有的:

class ManualBalanceUI(QtGui.QWidget):
    keyPressed = QtCore.pyqtSignal()

    def __init__(self, cls):
        super(QtGui.QWidget, self).__init__()
        self.window = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint)
        self.ui = uic.loadUi('ManualBalanceUI.ui', self.window)
        self.keyPressed.connect(self.on_key)

    def keyPressEvent(self, event):
        super(ManualBalanceUI, self).keyPressEvent(event)
        self.keyPressed.emit(event) 

    def on_key(self, event):
        if event.key() == QtCore.Qt.Key_Enter and self.ui.continueButton.isEnabled():
            self.proceed()  # this is called whenever the continue button is pressed
        elif event.key() == QtCore.Qt.Key_Q:
            self.window.close()  # a test I implemented to see if pressing 'Q' would close the window
     def proceed(self):
         ...
     ...

然而,目前看来这并没有起到任何作用。按“Q”不会关闭窗口,而且我无法真正判断“回车”键是否有效。

我事先看过这个问题:PyQt 连接到 KeyPressEvent https://stackoverflow.com/questions/27475940/pyqt-connect-to-keypressevent

我还查看了 SourceForge 上的所有文档。任何帮助将不胜感激!


您可以采取两种方法,一种是简单地重新实现 keyPressevent,无需任何花哨的工作。像这样

from PyQt4 import QtCore, QtGui
import sys

class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.setGeometry(300, 300, 250, 150)
        self.show()

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Q:
            print "Killing"
            self.deleteLater()
        elif event.key() == QtCore.Qt.Key_Enter:
            self.proceed()
        event.accept()

    def proceed(self):
        print "Call Enter Key"

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

或者当您尝试使用信号时,如果您缺少正确实现此信号的情况,这里是更新版本。

class Example(QtGui.QWidget):
    keyPressed = QtCore.pyqtSignal(QtCore.QEvent)
    def __init__(self):
        super(Example, self).__init__()
        self.setGeometry(300, 300, 250, 150)
        self.show()
        self.keyPressed.connect(self.on_key)

    def keyPressEvent(self, event):
        super(Example, self).keyPressEvent(event)
        self.keyPressed.emit(event) 

    def on_key(self, event):
        if event.key() == QtCore.Qt.Key_Enter and self.ui.continueButton.isEnabled():
            self.proceed()  # this is called whenever the continue button is pressed
        elif event.key() == QtCore.Qt.Key_Q:
            print "Killing"
            self.deleteLater()  # a test I implemented to see if pressing 'Q' would close the window

    def proceed(self):
        print "Call Enter Key"

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

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

在 QWidget 中实现 keyPressEvent 的相关文章

随机推荐

  • CSS - 当链接悬停时更改另一个元素的样式?

    如何在链接悬停时更改另一个元素的样式 无需 jQuery JavaScript ul gt li gt a hover main opacity 0 1 main p font size 200px
  • 还有其他半/便携式方法来动态分配内存吗?

    this char buf NULL scanf ms buf 将获得动态分配的字符缓冲区 我知道这仅限于使用 Gcc 特别是 glibc 2 7 版本 编译的代码 我也知道 正确 和便携的方法是只使用malloc 和朋友 获取记忆 I m
  • 获取 jsoup 中元素的字符偏移量

    我需要将 jsoup 元素映射回源 HTML 中的特定字符偏移量 换句话说 如果我的 HTML 看起来像这样 Hello br World 我需要知道 Hello 从偏移量 0 开始 长度为 6 个字符 br 从偏移量 6 开始 长度为 5
  • Windows Phone 8(WP8) C# 代码不安全?

    编辑 您可以使用不安全的代码 您只需手动编辑 proj 文件 当我可以在手机上使用本机 C 代码时 为什么或为什么 WP8 上的 C 不支持不安全代码 我没想到这一点 我的意思是 拜托 我对 Microsoft 试图强行使用 C 的做法感到
  • id 表达式到底是什么?

    我无法清楚地理解什么是id expression是 我将首先遵循我在 C 标准的最新工作草案中发现的内容 冒险定义一个identifier 标识符是任意长的字母和数字序列 所以看起来任意长的字母和数字序列都可以是id expression
  • React Native 中的热重载和实时重载有什么区别?

    我在这里有点困惑 当我调试 React Native 应用程序时 我通常会启用两者热重载 and 实时重新加载 我想知道它们之间有什么区别 实时重新加载当文件更改时重新加载或刷新整个应用程序 例如 如果您有四个链接深入导航并保存了更改 则实
  • 如何从kinect fracetrack获取网格?

    如何获取 kinect 面部追踪网格 这是网格 https i stack imgur com aPtJt jpg https i stack imgur com aPtJt jpg 我尝试了多种方法 但无法使其发挥作用 e g http
  • 等待集合获取主干中的所有内容

    我有两套收藏 一个用于类别 另一个用于项目 我需要等待类别完成获取所有内容 以便为要获取的项目设置类别 另外 每次单击类别时 我都必须重新获取新的项目集合 因为每次单击类别时都会进行分页 它不会刷新或重新获取集合 因此分页代码会弄乱错误的集
  • 使用 It.IsAny() 的 Moq 单元测试失败

    我正在使用 Moq 为项目编写单元测试 当我尝试验证 DateTime 属性是否已分配值时 其中一个测试失败 这是我的验证 失败 mockTaskContext Verify context gt context TaskQueue Add
  • HDFS 作为 cloudera 快速入门 docker 中的卷

    我对 hadoop 和 docker 都很陌生 我一直致力于扩展 cloudera quickstart docker 镜像 docker 文件 并希望从主机挂载一个目录并将其映射到 hdfs 位置 以便提高性能并将数据保存在本地 当我在任
  • 使用 Logic App 将文件从 SFTP 服务器复制到 Blob 存储

    我想使用逻辑应用将文件从 SFTP 服务器复制到 Blob 存储 逻辑应用每 3 分钟由 重复 块触发一次 并检查服务器上有哪些文件以便复制它们 为了检查服务器上有哪些文件 我使用 列出文件夹中的文件 块 复制本身是通过管道运行执行的 到目
  • 需要在 webview Win 10 UWP 中获取鼠标事件

    我正在创建一个 win 10 UWP 应用程序
  • 如何在 SwiftUI 中的 NavigationView 中设置 ScrollView 的背景颜色

    我无法在下面设置背景颜色ScrollView在 SwiftUI 中 当我使用 background Color red 背景被切断 因此它不会进入导航栏下方 并且滚动似乎被破坏 我尝试了几种解决方案 但它们都不起作用 我有一个简单的视图层次
  • 将 IEnumerable 转换/转换为 IEnumerable

    我有一个类 Web 控件 它具有 IEnumerable 类型的属性 并且希望使用 LINQ 来处理该参数 有没有办法通过反射将 IEnumerable 强制转换 调用 而在编译时不知道类型 Method void IEnumerable
  • Laravel 5.0自定义404不使用中间件

    我正在使用中间件来解析模板的输出 这对于所有页面都运行良好 但是 当我想显示 404 为此提供了一个自定义页面 时 它不会将其视为 http 请求 这就是我的想法 因为它不通过中间件 我的问题是 如何让所有请求都通过中间件 错误页面不经过r
  • 检查这是否重复

    我想检查是否username已经存在并抛出错误消息 如果存在 有什么提示我该怎么做 我已经尝试过搜索但只找到了mysql errno但这对我不起作用 if valid pdo Database connect pdo gt setAttri
  • Java ant Eclipse运行错误[重复]

    这个问题在这里已经有答案了 可能的重复 ant错误JAVA HOME没有指向SDK https stackoverflow com questions 6285301 ant error java home does not point t
  • Ubuntu Linux 上的 dotnet core 使用 asp.net MVC 和 EF MySQL 错误 NU1001:无法恢复 MySql.Data.EntityFrameworkCore

    我构建了一个简单 扁平的 dotnet core MVC 应用程序 我希望它可以在 Linux 上运行 它使用 EF 从 mysql 表中提取一些记录并将它们显示在视图中 它全部在我的主机 Win10 上构建并运行 但不会在我用来测试的 U
  • R:生成十的幂序列

    如何在 R 中快速 高效地生成数字 1 10 100 1000 10000 的序列 I know seq可以给你一个由一定间隔分隔的数字序列 但是有没有一个函数可以给你一个数字的幂 10 0 10 1 1e 00 1e 01 1e 02 1
  • 在 QWidget 中实现 keyPressEvent

    我有一个带有继续按钮的 QDialog 窗口 继续按钮是默认按钮 因为每当我按下回车键时 就会按下继续按钮 我发现了一些奇怪的事情 当我按三下回车键时 继续按钮按了三下 然而 当我第四次按下它时 整个窗口都会关闭 我在关闭窗口的继续按钮正下