【PyQt学习篇 · ⑤】:QWidget - 鼠标操作

news2024/11/24 20:23:50

文章目录

  • 鼠标形状设置
    • 常用鼠标形状设置
    • 自定义鼠标形状
  • 重置形状
  • 获取鼠标
  • 鼠标跟踪
  • 鼠标跟踪案例

鼠标形状设置

常用鼠标形状设置

在PyQt中,QWidget类提供了设置鼠标形状的功能。可以使用setCursor()方法来更改QWidget及其子类的鼠标形状。该方法接受一个Qt.CursorShape参数,该参数定义了不同的鼠标形状选项。

以下是一些常用的鼠标形状选项及其对应的Qt.CursorShape常量:

  • Qt.ArrowCursor:标准箭头指针。
    在这里插入图片描述

  • Qt.UpArrowCursor:向上箭头指针。
    在这里插入图片描述

  • Qt.CrossCursor:十字形指针。
    在这里插入图片描述

  • Qt.IBeamCursor:I形指针(用于文本输入)。
    在这里插入图片描述

  • Qt.WaitCursor:无操作期间的等待指针。
    在这里插入图片描述

  • Qt.BusyCursor:忙碌指针。
    在这里插入图片描述

  • Qt.ForbiddenCursor:禁止指针。
    在这里插入图片描述

  • Qt.PointingHandCursor:手形指针,用于指示可点击的对象。
    在这里插入图片描述

  • Qt.WhatsThisCursor:上下问号指针,用于提供上下文帮助。
    在这里插入图片描述

  • Qt.SizeVerCursor:垂直调整大小指针。
    在这里插入图片描述

  • Qt.SizeHorCursor:水平调整大小指针。
    在这里插入图片描述

  • Qt.SizeBDiagCursor:对角线调整大小指针(从左上到右下)。
    在这里插入图片描述

  • Qt.SizeAllCursor:移动调整大小指针。
    在这里插入图片描述

  • Qt.SplitVCursor:垂直分割指针。
    在这里插入图片描述

  • Qt.SplitHCursor:水平分割指针。
    在这里插入图片描述

  • Qt.OpenHandCursor:打开手指针。
    在这里插入图片描述

  • Qt.ClosedHandCursor:闭合手指针。
    在这里插入图片描述

  • Qt.BlankCursor:隐藏鼠标指针(下面是一个空白的图片)。
    在这里插入图片描述

下面为常用鼠标设置的代码示例:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sys

app = QApplication(sys.argv)

window = QWidget()
window.resize(200, 200)

window.setCursor(Qt.BusyCursor)     # 设置鼠标形状为加载状态
window.show()

sys.exit(app.exec_())

运行结果:

在这里插入图片描述

自定义鼠标形状

在PyQt中,可以使用QCursor对象来将一张图片设置为鼠标指针的形状。下面是具体步骤:

  1. 导入所需的类:from PyQt5.QtGui import QPixmap, QCursor
  2. 加载图片:使用QPixmap类的fromImage()方法从文件或QImage对象中加载图片。例如,cursor_image = QPixmap('path/to/image.png') 将会创建一个QPixmap对象,其中包含了指定路径下的图片。
  3. 调整图片大小:如果需要,可以使用cursor_image.scaled()方法调整图片的大小。例如,scaled_image = cursor_image.scaled(32, 32) 会将图片调整为32x32像素大小的图片。
  4. 创建自定义鼠标形状:使用QCursor类的QCursor(cursor_image)构造函数,传入调整大小后的图片,创建一个自定义的QCursor对象。
  5. 设置QWidget的鼠标形状:使用QWidget的setCursor()方法将自定义的QCursor对象设置为QWidget的鼠标形状。

以下是一个示例代码,展示了如何将一张图片设置为QWidget的鼠标形状:
在这里插入图片描述

from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QCursor
import sys

app = QApplication(sys.argv)

window = QWidget()
window.setWindowTitle("自定义鼠标操作")
window.resize(300, 300)

pixmap = QPixmap('mouse.png')   # 创建一个图片对象
new_pixmap = pixmap.scaled(50, 50)  # 将缩放图片的对象返回,并用new_pixmap接收其返回值
cursor = QCursor(new_pixmap)    # 鼠标对象(图片对象)

window.setCursor(cursor)

window.show()
sys.exit(app.exec_())

运行结果:

在这里插入图片描述
此时将鼠标移动到控件窗口内就会出现自定义的图片。

但是,当我们要进行点击的操作时,发现当鼠标的中间位置到达目标位置时才能执行点击操作,这是因为在QCursor函数内部,它将鼠标图片的热点设置在中间位置。

在这里插入图片描述
因此可以通过修改图片的热点位置,就可实现鼠标点击生效的位置。如以下代码,QCursor(new_pixmap, 0, 0),其中的0,0即为热点位置,若想将热点位置改为鼠标右下角,可设置为50,50。因为前边使用pixmap.scaled(50, 50)已将图片缩放到50,50的尺寸大小

pixmap = QPixmap('mouse.png')   # 创建一个图片对象
new_pixmap = pixmap.scaled(50, 50)  # 将缩放图片的对象返回,并用new_pixmap接收其返回值
cursor = QCursor(new_pixmap, 0, 0)    # 鼠标对象(图片对象)

重置形状

在PyQt中,unsetCursor()是一个QWidget的方法,用于将QWidget的鼠标指针形状重置为默认形状。

以以上代码为例:

pixmap = QPixmap('mouse.png')   # 创建一个图片对象
new_pixmap = pixmap.scaled(50, 50)  # 将缩放图片的对象返回,并用new_pixmap接收其返回值
cursor = QCursor(new_pixmap, 0, 0)    # 鼠标对象(图片对象)

window.setCursor(cursor)
window.unsetCursor()    # 重置鼠标形状

运行结果:

在这里插入图片描述

获取鼠标

在PyQt中,你可以使用QWidgetpos()方法来获取鼠标的当前位置,使用QWidgetsetPos()方法来设置鼠标的位置。

下面分别来介绍这两个方法:

  1. 获取鼠标位置:pos()

    • pos()方法返回一个QPoint对象,表示当前鼠标的位置。(鼠标相对于屏幕的位置)QPoint对象有两个属性:x()表示横坐标,y()表示纵坐标。你可以使用这两个属性来获取具体的坐标值。
  2. 设置鼠标位置:setPos()

    • setPos(x, y)方法允许你将鼠标的位置设置为指定的横纵坐标。你可以通过给定的xy参数来指定新的坐标。
    • xy参数可以是一个整数或浮点数类型的值,表示相应的坐标位置。

在以上代码的基础上加上以下代码:

current_cursor = window.cursor()
print(current_cursor.pos())   # 打印当前鼠标的位置
current_cursor.setPos(0, 0)     # 移动鼠标到屏幕左上角
print(current_cursor.pos())   # 打印当前鼠标的位置

运行结果:

在这里插入图片描述

鼠标跟踪

在PyQt中,可以使用setMouseTracking()hasMouseTracking()这两个API函数来设置和查询鼠标跟踪功能。

  1. setMouseTracking()函数

    • setMouseTracking(enable)允许你开启或关闭鼠标跟踪功能。
    • enable参数是一个布尔值,如果为True,则开启鼠标跟踪功能;如果为False,则关闭鼠标跟踪功能。
    • 不跟踪:鼠标移动时,必须处于按下状态,才会触发mouseMoveEvent事件
    • 跟踪:鼠标移动时,不处于按下状态,也会触发mouseMoveEvent事件。
  2. hasMouseTracking()函数

    • hasMouseTracking()函数会返回一个布尔值,表示当前QWidget是否开启了鼠标跟踪功能。

以下是一个使用鼠标跟踪功能的示例代码:

from PyQt5.QtWidgets import *
import sys

class MyWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

    def mouseMoveEvent(self, me):
        print("鼠标移动了")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    window = MyWindow()
    window.resize(300, 300)
    window.show()

    sys.exit(app.exec_())

运行结果:
当鼠标放在控件内,未按下鼠标左键时,鼠标未进行跟踪,当长按鼠标左键并移动时,才会触发鼠标跟踪事件。

在这里插入图片描述
若在主程序中就设置鼠标跟踪,观察其结果:

window.setMouseTracking(True)	# 设置鼠标跟踪
print(window.hasMouseTracking())	# 打印鼠标跟踪状态

运行结果:
当鼠标移动到控件内,未按下鼠标左键,只移动,会直接触发鼠标跟踪事件,这是因为在程序中设置了鼠标跟踪。

在这里插入图片描述
在以上代码的基础上使用globalPos()方法打印鼠标的全局位置(相对于屏幕),使用localPos()方法打印局部位置(相对于控件)

def mouseMoveEvent(self, me):
    print('全局位置:', me.globalPos())
    print('局部位置:', me.localPos())

运行结果:

在这里插入图片描述

鼠标跟踪案例

案例:创建一个窗口,内部有一个label控件。

要求:

  • 鼠标移入窗口时,让label位置跟随鼠标位置。
  • 让鼠标设置为指定图片

以上案例的代码:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap, QCursor
import sys


class MyWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        # 设置窗口标题和大小
        self.setWindowTitle('鼠标跟踪案例')
        self.resize(500, 500)

        # 设置鼠标
        pixmap = QPixmap('mouse.png').scaled(50, 50)
        cursor = QCursor(pixmap, 0, 0)  # 设置热点为鼠标左上角
        self.setCursor(cursor)
        self.setMouseTracking(True)     # 开启鼠标跟踪

        # 设置标签
        label = QLabel(self)
        label.setText('我爱Python,我学PyQt')
        label.setStyleSheet('background-color: cyan;')

    def mouseMoveEvent(self, me):
        # 让标签跟踪鼠标
        label = self.findChild(QLabel)
        label.move(me.localPos().x(), me.localPos().y())

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

    window = MyWindow()
    window.show()

    sys.exit(app.exec_())

运行结果:

在这里插入图片描述

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

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

相关文章

idea的设置

1.设置搜索encoding,所有编码都给换为utf-8 安装插件 eval-reset插件 https://www.yuque.com/huanlema-pjnah/okuh3c/lvaoxt#m1pdA 设置活动模板,idea有两种方式集成tomcat,一种是右上角config配置本地tomcat,一种是插件,如果使用插件集成,则在maven,pom.xml里面加上tomcat…

【uniapp】uniapp实现input输入显示数字键盘:

文章目录 一、官网文档:二、文档:三、效果:【1】number:iPhone原生数字键盘不显示小数点【2】digit:【3】digit和inputmode: 一、官网文档: input | uni-app官网 二、文档: 三、效果…

深度学习中Transformer的简单理解

Transformer 网络结构 Transformer也是由编码器和解码器组成的。 每一层Encoder编码器都由很多层构成的,编码器内又是self-attention和前馈网络构成的。Self-attention是用来做加权平均,前馈网络用来组合。 但是decoder有点不同,多了一层En…

Vue 3 响应式对象:ref 和 reactive 的使用和区别

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…

私有云:【11】win10安装Agent客户端组件

私有云:【11】win10安装Agent客户端组件 1、配置IP及加入域2、安装Agent客户端组件3、生成win10快照 1、配置IP及加入域 配置ip及dns 修改计算机名且加入域 进行验证 加入成功 将cloudadmin用户加入管理员组 输入cloudadmin户名密码验证 2、安装Agent客户端组件 …

第八周实验记录

10月20日-10月22日工作: 复现S-NeRF代码,按照github的步骤进行,首先使用一个RTX3090显卡, 在下图步骤中:运行最后一步 python scripts/run.py 出现问题 继续使用两张RTX3090显卡尝试,依旧在这一步出现问…

如何防范AI等技术带来的诈骗风险?从技术、法律、教育等多方面入手

文章目录 前言什么是AI诈骗案例案例一案例二 AI诈骗的特点如何预防和应对AI诈骗建议后记 前言 互联网是一把双刃剑,这是我们常说的一个问题。 随着人工智能技术的快速发展,AI诈骗成为当今社会面临的新兴威胁。不法分子利用人工智能技术,以更…

趣互联app一分购地推网推拉新上线平台啦,简单流程

趣互联一手渠道 “聚量推客” 上架趣互联啦,适合地推和网推进行推广,社群私域也可以推广,比较简单。 如果你在做拉新推广 地推或者网推都可以通过“聚量推客”获取最大收益

SDXL简介

SDXL是一个文生图模型。相比旧版的stable diffusion,SDXL主要的不同有三点: 有一个refinement model,通过image-to-image的方式来提高视觉保真度。使用了两个text encoder,OpenCLIP ViT-bigG和CLIP ViT-L。增加了图片大小和长宽比…

解决:getReader() has already been called for this request

问题现场: 原因: HttpServletRequest 的 getInputStream() 和 getReader() 都只能读取一次。 因为 我们使用RequestBody 注解,读取body参数;而 又 写了拦截器,也需要将post请求,body数据拿出来。 由于RequestBody 也是…

JVM第二十三讲:Java动态调试技术原理

Java动态调试技术原理 本文是JVM第二十三讲,Java动态调试技术原理。转载自 美团技术团队胡健的Java 动态调试技术原理及实践,通过学习java agent方式进行动态调试,了解目前很多大厂开源的一些基于此的调试工具 (例如来自阿里开源的Arthas)。 …

工作组与域

目录 内网环境 内网环境分类 工作组 域 域的组成 域中的信任关系 父域与子域 域的结构 林中信任关系特点 域中的域名 活动目录(AD) 域中活动目录下的账号登录域中计算机过程 组织单位(OU) 组策略(GPO&am…

【C++】priority_queue模拟实现+仿函数+反向迭代器

priority_queue模拟实现仿函数反向迭代器 1.priority_quyue1.1priority_queue的使用1.2priority_queue模拟实现1.2.1无参构造一段区间构造1.2.2push1.2.3pop1.2.4empty1.2.5size1.2.6top 2.仿函数2.1什么是仿函数2.2增加仿函数的priority_queue模拟实现完整代码 3.反向迭代器3.…

私有云:【13】用户授权及访问

私有云:【13】用户授权及访问 1、AD域中为云桌面用户2、用户授权及访问3、本地物理机访问云桌面 1、AD域中为云桌面用户 创建用户 密码永不过期,自行选择设置 完成 2、用户授权及访问 添加授权 添加 - 搜索名称【刚创建的dev_01用户】 选择dev_01用户…

MinIO 高性能分布式存储最新版单机与分布式部署

文章目录 一、概述二、单机部署(单主机,多硬盘模式)1)磁盘初始化2)创建服务启动用户并设置磁盘属主3)下载 minio 安装包4)修改配置5)配置 systemctl 启动6)客户端工具 mc…

拜耳阵列(Bayer Pattern)和解马赛克简介

拜尔阵列 典型的图像传感器(例如我们在数码相机中使用的图像传感器,主要有CCD, CMOS)由许多单独的光电传感器组成,所有这些传感器都会捕获光线。这些光电传感器本身能够捕获光的强度,但不能捕获其波长(颜色…

BUUCTF_练[PASECA2019]honey_shop

[PASECA2019]honey_shop 文章目录 [PASECA2019]honey_shop掌握知识解题思路关键paylaod 掌握知识 页面信息收集,根据下载的图片找到下载链接,确定url的参数进行利用;session字段的解密和解密,session伪造的考点。 解题思路 打开…

科技驱动教育!将名师智慧资产固定在系统中

文章目录 每日一句正能量前言未来教育教育趋势一、在线教育:打破时间和空间的限制二、混合式学习:结合线上和线下的优势三、项目式学习:以问题为导向,以项目为载体 科技驱动教育模式在线教育人工智能教育虚拟现实/增强现实教育游戏…