python之pyqt专栏10-键盘事件

news2024/12/26 21:44:12

需求

        通过按键盘的上下左右,移动button的位置。

UI界面设计

代码 

# 导入sys模块
import sys

from PyQt6.QtCore import Qt
# PyQt6.QtWidgets模块中导入QApplication, QWidget
from PyQt6.QtWidgets import QApplication, QWidget

# untitled模块中导入Ui_Form类
from untitled import Ui_Form


class MyMainForm(QWidget, Ui_Form):
    def __init__(self, parent=None):
        # 调用父类的构造函数
        super(MyMainForm, self).__init__(parent)
        # 调用继承Ui_Form过来的setupUi函数
        self.setupUi(self)
        # self.setFocusPolicy()
        self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
    def keyPressEvent(self, a0):
        # 获取当前位置
        pass



    def keyReleaseEvent(self, a0):
        self.btnx = self.pushButton.pos().x()
        self.btny = self.pushButton.pos().y()
        if (a0.key() == Qt.Key.Key_Left):
            self.btnx = self.btnx - 5
            print(f"left:{self.btnx}")

        elif (a0.key() == Qt.Key.Key_Right):
            self.btnx = self.btnx + 5
            print(f"left:{self.btnx}")

        elif (a0.key() == Qt.Key.Key_Up):
            self.btny = self.btny - 5

        elif (a0.key() == Qt.Key.Key_Down):
            self.btny = self.btny + 5
        else:
            pass
        self.pushButton.move(self.btnx, self.btny)




# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    # 实例化应用
    app = QApplication(sys.argv)
    # 实例化MyMainForm
    myw = MyMainForm()
    myw.show()
    # 启动应用程序的事件循环并等待用户交互,直到应用程序关闭。
    sys.exit(app.exec())

        

 代码解释:

         1:设置窗口获取焦点,否者通过按键可以没有反应

 self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)

 

         2:与鼠标事件一样,如果需要实现键盘事件,也需要对键盘事件进行重写。由于只是对键盘按下与抬起(可以在QWidget找到它们,如下图),只实现对keyReleaseEvent(self, a0):

                

         获取button相对于窗体的位置

self.btnx = self.pushButton.pos().x()
self.btny = self.pushButton.pos().y()

       判断哪个方向键被按下,改变对应的坐标,通过key(),获取按下的键

        当键盘左键被按下,x坐标-5;

        当键盘右键被按下,x坐标+5;

        当键盘上键被按下,y坐标-5;

        当键盘下键被按下, y坐标-5;

        if (a0.key() == Qt.Key.Key_Left):
            self.btnx = self.btnx - 5
            print(f"left:{self.btnx}")

        elif (a0.key() == Qt.Key.Key_Right):
            self.btnx = self.btnx + 5
            print(f"left:{self.btnx}")

        elif (a0.key() == Qt.Key.Key_Up):
            self.btny = self.btny - 5

        elif (a0.key() == Qt.Key.Key_Down):
            self.btny = self.btny + 5
        else:
            pass

 Qt.Key.按键编号,可以在Qt — PyQt Documentation v6.6.0里面找到

         移动按钮位置

self.pushButton.move(self.btnx, self.btny)

        结果

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程间通信2

3. system V-IPC 3.1 知识点 ipcs -a查看所有的ipc对象 在系统中他们都使用一种叫做 key 的键值来唯一标识,而且他们都是“持续性”资源——即他 们被创建之后,不会因为进程的退出而消失,而会持续地存在,除非调用特殊的函数或者…

带你手搓阻塞队列——自定义实现

🌈🌈🌈今天给大家分享的是——阻塞队列的自定义实现,通过自定义实现一个阻塞队列,可以帮助我们更清晰、更透彻的理解阻塞队列的底层原理。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章…

C++stack

目录 1.什么是stack 2.容器适配器 3.stack的使用 top push pop 4.模拟实现stack 1.什么是stack 1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。(后进先出) 2. stack是作为容…

进程间通信方式——管道

进程间通信方式——管道 1、管道2、匿名管道2.1 创建匿名管道2.2 进程间通信 3、有名管道3.1 创建有名管道3.2 进程间通信 4、管道的读写行为 原文链接 1、管道 管道的是进程间通信(IPC - InterProcess Communication)的一种方式,管道的本质…

深入 C 语言和程序运行原理 实战项目代码在CentOS 7上编译

cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core),uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64。 安装gtest 参考博客《使用gtest和lcov测试代码覆盖率》 wget https://github.com/google/googletest/archive/refs/…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

Promise的resolve和reject方法(手写题)

1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…

国内首所国际职业培训学院落户深圳盐田揭幕开业

11月26日,中科国药•中科大有大健康上市企业孵化平台迎来了国内首所国际职业学院——深圳市盐田区国际职业培训学院的正式落成与揭幕仪式。中科大有高新科技有限公司董事长、长江商学院MBA\FMBA金融导师、深圳市中科国药生物医药研究院理事长、深圳市盐田区国际职业…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了💥我已经后悔了😭后悔没早点学习鸿蒙 HarmonyOS 概念,系统定位 1:鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统,它具有以下特别之处: 2:分布式架构:…

华为鸿蒙工程师成“热门”!最高年薪160万,只看技术不看年龄

引言: 今天,在互联网行业,超过30岁的工程师往往被认为是“码农”的生命周期终点。然而,华为鸿蒙系统的崛起,却再次给予了这些35岁以上的工程师们第二春的机会。国内一线互联网公司纷纷向鸿蒙系统靠拢,导致…

c语言练习13周(1~5)

输入任意整数n求以下公式和的平方根。 读取一系列的整数 X,对于每个 X,输出一个 1,2,…,X 的序列。 编写double fun(int a[M][M])函数,返回二维数组周边元素的平均值,M为定义好的符号常量。 编写double fun(int a[M])函…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类…

Unity 使用Horizontal Layout Group和Toggle制作多个水平开关按钮实现自动排列和单个点击放大后的自动排列。

Unity的布局组件Horizontal Layout Group是很好用的,当然也包括其它布局组件也一样好用。 比如要实现多按钮开关自动水平排列,那么就可以使用它了。 首先我们为按钮创建个父物体(我这里使用了Scroll View中的Content作为父物体)…

elementUI实现根据屏幕大小自适应换行,栅格化布局

需求: 默认一行展示4个卡片;当屏幕小于某个大小的时候,一行展示3个卡片;再小就展示2个;以此类推,最小就展示1个。 效果卡片样式如下图: 默认一行4个 屏幕缩小到某个阈值,一行展示…

11.26电梯控制器设计分析

项目三 电梯控制器设计(*****) 设计一个多楼层的电梯控制器系统,并能在开发板上模拟电梯运行状态。可以利用按键作为呼叫按键,数码管显示电梯运行时电梯所在楼层,led灯显示楼层叫梯状态。 就是初始默认在1楼&#xff0…

【LeetCode:1657. 确定两个字符串是否接近 | 计数 + 阅读理解】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19

一些原理文章 卷积神经网络基础(卷积,池化,激活,全连接) - 知乎 PyTorch 入门与实践(六)卷积神经网络进阶(DenseNet)_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…

Web 实时消息推送

Web 实时消息推送详解 什么是消息推送? 推送的场景比较多,比如有人关注我的公众号,这时我就会收到一条推送消息,以此来吸引我点击打开应用。 消息推送通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移…

最小化安装 Neokylin7.0 用于搭建 Hadoop 集群

文章目录 环境搭建背景虚拟机创建和环境配置安装过程注意事项虚拟机设置软件选择KOUMP系统分区网络和主机名打开以太网,并记录信息配置 IPv4修改主机名 创建用户 hadoop完全分布式搭建-CSDN博客 环境搭建背景 为什么不从hadoop100或者hadoop101开始,而是…

引领数据趋势:2023年最值得关注的十大ETL数据集成工具

在这个数据至上的时代,对于以数据为驱动的组织来说,建立一个信息集中的强大源头是成功的关键。众多企业依靠ETL工具来管理和理解它们的数据。 ETL,即提取(Extract)、转换(Transform)、加载&…