【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战

news2024/11/17 8:43:01

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑

文章目录

  • PyQt5鼠标事件
    • 鼠标跟踪
    • 鼠标跟踪案例实战
  • PyQt5的事件API详解
    • 一、每个事件都被封装成相应的类
    • 二、基类QEvent的几个重要方法
    • 三、QMouseEvent鼠标事件
    • 四、处理鼠标事件的响应函数(在QWidget及其继承类中)
    • 五、处理鼠标事件的一些常见操作
    • 六、鼠标和键盘事件案例实战

PyQt5鼠标事件

鼠标跟踪

在PyQt5中想要实现追踪鼠标的坐标,并实现实时打印出来,需要开启鼠标追踪功能。如果想要界面中的所有组件,或者QDialog弹窗获取坐标点,那么每个组件都需要做如下设置

setMouseTracking(True)

默认是没有鼠标跟踪的,只有鼠标按下移动鼠标,才会触发鼠标移动事件
在这里插入图片描述

默认情况下,按下鼠标移动才会触发鼠标移动事件
案例分析

from PyQt5.Qt import *
import sys

class MyWindow(QWidget):
    def __init__(self):
        # 当我们继承某个类时,需要调用父类构造方法
        super().__init__()
        # 设置窗口标题
        self.setWindowTitle("鼠标移动")
        self.resize(500, 500)
        self.setup_ui()

    # 此处调用一个个UI的方法展示即可
    def setup_ui(self):
        pass


    #重写父类方法
    def mouseMoveEvent(self, me):
        print("鼠标移动了")



if __name__ == '__main__':


    app = QApplication(sys.argv)

    window = MyWindow()


    window.show()

    sys.exit(app.exec_())

运行, 不按下鼠标左键,不触发mouseMoveEvent方法,按下后触发
在这里插入图片描述
查看鼠标是否跟踪

#查看鼠标是否跟踪
print(window.hasMouseTracking())

默认鼠标是没有跟踪的
在这里插入图片描述
设置鼠标跟踪

设置鼠标跟踪
window.setMouseTracking(True)

当设置的鼠标跟踪,不用按下鼠标左键,移动鼠标,也会触发mouseMoveEvent方法
在这里插入图片描述

当触发鼠标移动事件方法时,会传进来一个事件对象QMouseEvent,这个事件对象里面有很多方法
在这里插入图片描述

我们可以根据这个事件对象,获取鼠标的实时位置
在这里插入图片描述

获取相对于窗口的位置

print(me.localPos())

在这里插入图片描述

鼠标跟踪案例实战

在这里插入图片描述

from PyQt5.Qt import *
import sys


#设置鼠标跟踪,需要重写mouseMoveEvent方法,需要继承

class MyWindow(QWidget):
    #QMouseEvent
    #将鼠标位置设为类变量
    def mouseMoveEvent(self, me):
        print("鼠标移动了")
        #在方法里面通过查找子类,获取到标签,然后再让标签移动
        lable = self.findChild(QLabel)
        lable.move(me.x(),me.y())



if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = MyWindow()

    window.setWindowTitle("鼠标移动案例")
    window.move(500,200)
    window.resize(500,500)

    #设置鼠标跟踪
    window.setMouseTracking(True)

    #自定义鼠标形状
    # 创建QPixmap对象,并设置显示的图片
    pixmap = QPixmap("xxx.png")

    # 设置对象宽和高按比例缩小,返回一个新对象。原对象并没有被缩放
    #pixmap.scaled(targetWidth, targetHeight, Qt.KeepAspectRatio)
    #targetWidth 和 targetHeight 是目标缩小后的宽度和高度。Qt.KeepAspectRatio 参数表示保持宽高比。
    new_pixmap = pixmap.scaled(50, 50,Qt.KeepAspectRatio)

    # 创建QCursor对象(鼠标对象),用作setCursor参数
    # 设置该对象的作用点为图片的左上角(0,0),默认是图片中心点
    # 默认QCursor(pixmap: QPixmap, hotX: int = -1, hotY: int = -1) 表示作用点在图片中心点
    cursor = QCursor(new_pixmap, 0, 0)

    # 设置window控件的鼠标样式为自定义的QCursor对象:cursor
    window.setCursor(cursor)


    #创建标签
    lable = QLabel(window)
    lable.setText("景天科技苑,科技不间断")

    lable.setStyleSheet("background-color:cyan;")

    window.show()

    sys.exit(app.exec())

运行,在控件里面移动鼠标,标签就跟着鼠标移动
在这里插入图片描述

PyQt5的事件API详解

API详解
在这里插入图片描述

一、每个事件都被封装成相应的类

pyqt中,每个事件类型都被封装成相应的事件类,如鼠标事件为QMouseEvent,键盘事件为QKeyEvent等。而它们的基类是QEvent。

二、基类QEvent的几个重要方法

accept() 表示事件已处理,不需要向父窗口传播

ignore()表示事件未处理,继续向父窗口传播f

type()返回事件类型,如QtCore.QEvent.MouseButtonPress,一般由基事件调用。因为其它事件已经知道自己的事件类型了。

还有一个自定义事件的注册方法。

三、QMouseEvent鼠标事件

buttons()返回哪个鼠标按键被按住了。如Qt.LeftButton

globalPos()返回鼠标相对屏幕的位置QPoint

pos()返回鼠标相对处理事件的窗口的位置

四、处理鼠标事件的响应函数(在QWidget及其继承类中)

mousePressEvent(QMouseEvent)

mouseReleaseEvent(event)

mouseMoveEvent(event)

五、处理鼠标事件的一些常见操作

处理鼠标事件的频率不低于键盘事件。包括按下、松开鼠标按键;移动鼠标到特定区域或离开特定区域;更改鼠标指针的形状,等等。

按下、松开鼠标按键

按下并释放鼠标按钮时,将调用以下方法:

mousePressEvent (self,  event) - 鼠标键按下时调用;
mouseReleaseEvent (self, event) - 鼠标键公开时调用;
mouseDoubieCiickEvent (self, event) - 双击鼠标时调用。必须注意,在双击之前的其他事件。双击时的事件顺序如下:
MouseButtonPress
MouseButtonRelease
MouseButtonDblClick
MouseButtonPress
MouseButtonRelease
QApplicaption类的setDoubleClickInterval( )方法可设置双击的时间间隔;doubleClickInterval( )方法返回双击的时间间隔。
    event参数是QMouseEvent对象,存储事件的其他信息。有以下方法:

x() 和 y() -返回相对于控件空间的鼠标坐标值;
pos() - 返回相对于控件空间的QPoint对象;
localPos()- 返回相对于控件空间的QPointF对象;
globalX() 和 globalY() -  返回相对于屏幕的x,y 坐标值;
globalPos() - 返回相对于屏幕的QPoint对象;
windowPos() -  返回相对于窗口的QPointF对象; 
screenPos() - 返回相对于屏幕的QPointF对象; 
button() - 返回以下枚举值(只列了部分,详细内容参见 https://doc.qt.io/qt-5/qt.html#MouseButton-enum,用以判断是哪个鼠标健触发了事件。
QtCore.Qt.NoButton - 0 - 没有按下鼠标键。例如移动鼠标时的button()返回值;
QtCore.Qt.LeftButton -1 -按下鼠标左键;
QtCore.Qt.RightButton -2 -按下鼠标右键;
QtCore.Qt.Mion 或 QtCore.Qt.MiddleButton -4 -按下鼠标中键;
buttons() - 返回前面所列枚举值的组合,用于判断同时按下了哪些键。
modifiers() - 判断按下了哪些修饰键(Shift,Ctrl , Alt,等等),详见键盘事件(18)中的modifiers()。
timestamp() - 返回事件发生的时间;
    如果要让父控件继续收到鼠标事件,要调用事件的ignore()方法;否则,调用accept()。

    如果一个控件的QtCore.Qt.WA_NoMousePropagation的属性设为True,则不会将事件传递给父控件。调用setAttribute( )方法可修改此参数:
    button.setAttribute (QtCore.Qt.WA_NoMousePropagation, True)

    缺省情况下,鼠标事件只拦截控件区域上的鼠标操作。如果可拦截控件区域以下的鼠标事件,必须调用grabMouse( )方法;释放时,调用releaseMouse( )。

六、鼠标和键盘事件案例实战

from PyQt5.Qt import *

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("事件消息")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        pass

    #初始化窗口后就触发
    def showEvent(self, QShowEvent):
        print("窗口被展示了出来")

    #关闭窗口时触发
    def closeEvent(self, QCloseEvent):
        print("窗口被关闭了")


    #窗口移动时触发
    def moveEvent(self, QMoveEvent):
        print("窗口被移动了")

    #窗口尺寸改变时触发
    def resizeEvent(self, QResizeEvent):
        print("窗口改变了尺寸大小")

    #鼠标进入控件时触发
    def enterEvent(self, QEvent):
        print("鼠标进来了")
        # 设置控件背景颜色
        self.setStyleSheet("background-color: yellow;")

    #鼠标离开控件时触发
    def leaveEvent(self, QEvent):
        print("鼠标移开了")
        #设置控件背景颜色
        self.setStyleSheet("background-color: green;")


    #鼠标按键被按下时触发,不管哪个按键按下都触发

    def mousePressEvent(self, QMouseEvent):
        #查看鼠标哪个按键被按下
        print("鼠标被按下",QMouseEvent.button())

    #松开鼠标按键时触发
    def mouseReleaseEvent(self, QMouseEvent):
        print("鼠标被释放")

    #双击下鼠标按键时触发
    def mouseDoubleClickEvent(self, QMouseEvent):
        print("鼠标双击")

    #按下鼠标按键,并移动鼠标时触发
    def mouseMoveEvent(self, QMouseEvent):
        print("鼠标移动了")

    #按下键盘上按键时触发
    # QKeyEvent
    def keyPressEvent(self, QKeyEvent):
        #获取哪个键盘上哪个按键被按下,得到的是ascii码
        print("键盘上某一个按键被按下了",QKeyEvent.key())

    #松开键盘按键时触发
    def keyReleaseEvent(self, QKeyEvent):
        print("键盘上某一个按键被释放了")


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)

    window = Window()

    window.show()



    sys.exit(app.exec_())

运行
在这里插入图片描述

按下鼠标左键
在这里插入图片描述

按下键盘a键
在这里插入图片描述

其他键盘按键也得到的是ascii码,感兴趣的小伙伴可以试试

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

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

相关文章

稀疏建模介绍,详解机器学习知识

目录 一、什么是机器学习?二、稀疏建模介绍三、Lasso回归简介四、Lasso超参数调整与模型选择 一、什么是机器学习? 机器学习是一种人工智能技术,它使计算机系统能够从数据中学习并做出预测或决策,而无需明确编程。它涉及到使用算…

二叉树树的知识,选择➕编程

在一棵深度为7的完全二叉树中,可能有多少个结点?(1层深度为1,节点个数为1) 对于深度 d的完全二叉树: 完全二叉树中,前 d−1层是满的。 最后一层(第 d 层)可以不满&#x…

imazing电脑怎么下载 imazing怎么下载软件 使用iMazing下载和卸载Apple设备上的应用程序

iMazing官方版是一款管理苹果设备的软件,是一款帮助用户管理 iOS手机的PC端应用程序,能力远超 iTunes 提供的终极 iOS 设备管理器。在iMazing官方版上与苹果设备连接后,可以轻松传输文件,浏览保存信息等,功能比iTunes更…

【C++题解】1108 - 正整数N转换成一个二进制数

问题:1108 - 正整数N转换成一个二进制数 类型:进制转换 题目描述: 输入一个不大于 32767 的整数 n ,将它转换成一个二进制数。 输入: 输入只有一行,包括一个整数 (0 ≤ n ≤ 32767)。 输出…

Day1--每日一练

🍁 个人主页:爱编程的Tom💫 本篇博文收录专栏:每日一练-算法篇👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ Java专栏等 🎉 欢迎 👍点赞✍评论⭐收藏&…

MacOS和Windows中怎么安装Redis

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 关注 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、MacOS中Redis的安装2.1 HomeBrew 安装(推荐)2.2 通过官方…

终于找到了免费的C盘清理软件(极智C盘清理)

搜了很久,终于让我找到了一款 完全免费的C盘清理软件(极智C盘清理)。 点击前往官网免费使用极智C盘清理软件: C盘清理 用户好评 完全免费的极智C盘清理 用极智C盘清理清理了下系统的临时文件、缓存等无用数据文件,C盘终…

PHP灵活用工任务小灵通微信小程序系统源码

💼灵活赚钱新风尚!灵活用工任务小灵通微信小程序,兼职自由两不误🚀 🔍 一、海量任务,随时随地接单赚外快 还在为找不到合适的兼职而烦恼吗?🤔 灵活用工任务小灵通微信小程序&#…

数字交流便携式电阻式三相负载组

三相型号选项范围从小型、便携式、低功耗单元到大功率、室内和室外永久电阻负载组。型号标配按钮式手动控制以及 PC 软件控制,为处理复杂的测试应用提供先进的负载曲线解决方案。这些装置适用于各种用途,包括测试发电机、UPS 系统、数据中心电源系统、电…

3D非遗刺绣作品数字化展厅身临其境地感受艺术的魅力与力量

走进3D艺术画展,一场颠覆传统的视觉盛宴即将上演。在这里,静态的观赏被赋予了全新的生命,观众将亲身体验到前所未有的参与性和互动性。 不同于传统的美术展览,3D艺术画展打破了旧有的观展形式,将艺术与科技完美结合&am…

前端画图引擎ZRender,echarts的渲染器,你知道吗?

Zrender是一个轻量级的Canvas和SVG渲染库,它提供了一个高性能的图形绘制和交互的解决方案,用于在Web页面上创建丰富的数据可视化和交互式图形。 可能大部分小伙伴不知道这个类库,本文给大家科普一下。 一、Zrender是谁? 该项目…

B端工作台如何设计?指导思想+布局建议+大厂案例全给你

一、B端工作台设计的指导思想 要做好B端工作台设计,以下是一些建议和策略: 1. 用户研究:深入了解目标用户的需求、行为和工作流程。通过用户研究方法,如用户访谈、观察和调研,收集用户反馈和意见,了解他们…

RoPE旋转位置编码从复数到欧拉公式

第二部分 从复数到欧拉公式 先复习下复数的一些关键概念 我们一般用表示复数,实数a叫做复数的实部,实数b叫做复数的虚部 复数的辐角是指复数在复平面上对应的向量和正向实数轴所成的有向角 的共轭复数定义为:,也可记作&#xff0…

windows环境下部署多个端口Tomcat服务和开机自启动设置保姆级教程

前言 本文主要介绍了 windows环境下,配置多个Tomcat设置不同端口启动服务。其实在思路上Linux上也是适用的,只是 Linux 上没有可视化客户端,会麻烦些,但总体的思路上是一样的。 注:文章中涉及些文字和图片是搬运了其他…

【分布式系统三】监控平台Zabbix对接grafana(截图详细版)

目录 一.安装grafana并启动 二.浏览器访问 三.导入zabbix数据,对接grafana 四.如何导入模版 以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 …

上海亚商投顾:沪指低开低走 全市场下跌个股超4800只

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日低开低走,尾盘集体跌超1%,北证50、微盘股指数跌逾3%。 板块概念方面&…

发那科机床联网串口配置

本文章仅针对无网口,需要通过串口输出采集数据情况。跟这篇文章互为参考,一个理论,一个实战。 Fanuc DPRNT宏程序串口采集-CSDN博客 一、禁用机器串口监控 选择System、monit 二、设置参数可写 在MDI模式中字符面板上按OFS/SET键,连按致屏…

NET Core 中的空对象设计模式

介绍 一种称为“空对象模式”的行为设计模式提供了一个对象来表示接口缺少的对象。在空对象会导致空引用异常的情况下,这是一种提供替代行为的方法。在本文中,我们将深入探讨 C# 空对象模式,并逐步解决更复杂的情况。 空对象设计模式它是什…

使用 C# 训练大型语言模型和小型语言模型

介绍 训练大型语言模型 (LLM) 和小型语言模型 (SLM) 在人工智能和机器学习领域获得了巨大的关注。这些模型能够理解和生成类似人类的文本,具有从聊天机器人到高级数据分析的广泛应用。本文探讨了使用 C#(一种在企业环境中广泛使用的面向对象编程语言&am…