Python GUI 编程 | QWidget 窗口控件详解 — 鼠标跟踪操作

🌟想系统化学习 GUI 编程?看看这个:[Python GUI 编程] PySide & PyQt - 学习手册-优快云博客

0x01:QWidget 鼠标跟踪 — 相关方法

这里所谓的 “鼠标跟踪”,其实就是检测鼠标移动事件的条件。

0x0101:setMouseTracking(bool)

1. 当不开启鼠标跟踪时的表现

QWidget 的 setMouseTracking() 函数可以设置是否开启 “鼠标跟踪”,默认情况下为不跟踪,即当鼠标移动时,必须处于按下状态,才会触发 mouseMoveEvent() 事件。

该事件为系统内置事件,我们想要操作该事件,就需要利用子类重写该方法。看下面这个示例代码:

import sys
from PyQt5.Qt import *
​
class MyWidget(QWidget):
    def mouseMoveEvent(self, event):
        """
        这里传递过来的 event 是一个 QMouseEvent 对象
        """
        print("鼠标移动了")
​
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
window = MyWidget()
# 3. 展示控件
window.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

2. 当开启鼠标跟踪时的表现

当用户通过 setMouseTracking() 函数开启了鼠标跟踪后,只要用户的鼠标在程序内移动,就会触发 mouseMoveEvent() 事件:

import sys
from PyQt5.Qt import *
​
class MyWidget(QWidget):
    def mouseMoveEvent(self, event):
        """
        这里传递过来的 event 是一个 QMouseEvent 对象
        """
        print("鼠标移动了")
​
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
window = MyWidget()
window.setMouseTracking(True) # 开启全局鼠标追踪
# 3. 展示控件
window.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

3. mouseMoveEvent(self, event) 事件

这里笔者有必要提一下,鼠标移动时触发的这个 mouseMoveEvent() 事件,该事件接收两个参数,第一个 self 很好理解,面向对象嘛,第二给参数是一个 QMouseEvent 对象。

既然是对象,那就有对象相关的属性与方法,那咋查看呢?通过 IDE 点击 QMouseEvent 进行追踪即可:

这里咱们举一个例子,每当用户鼠标在窗口中移动时,就打印其相对于窗口左上角的位置:

import sys
from PyQt5.Qt import *
​
class MyWidget(QWidget):
    def mouseMoveEvent(self, event):
        """
        这里传递过来的 event 是一个 QMouseEvent 对象
        """
        print("当前鼠标位置: ", event.localPos()) # 调用 QMouseEvent 对象的 localPos() 方法获取鼠标位置
​
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
window = MyWidget()
window.setMouseTracking(True)
# 3. 展示控件
window.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

0x0102:hasMouseTracking()

QWidget 提供了 hasMouseTracking() 方法用于判断当前窗口是否设置了鼠标跟踪:

import sys
from PyQt5.Qt import *
​
class MyWidget(QWidget):
    def mouseMoveEvent(self, event):
        """
        这里传递过来的 event 是一个 QMouseEvent 对象
        """
        print("鼠标移动了")
​
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
window = MyWidget()
window.setMouseTracking(True) # 开启全局鼠标追踪
print("鼠标跟踪是否已经打开: ", window.hasMouseTracking()) # 判断鼠标追踪是否已经打开
# 3. 展示控件
window.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

0x02:QWidget 鼠标跟踪 — 演示案例

知识传送门 🚀

该案例需要用到我们前两章讲解的内容,相关知识点的传送门已经放在上面了,不会的小伙伴过去看看哈,下面是本次案例的演示代码(cursor.png 自己找哈,笔者前面都教过了):

import sys
from PyQt5.Qt import *
​
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.setMouseTracking(True) # 设置鼠标追踪
        self.resize(800, 800)
        self.init_ui()
​
    def init_ui(self):
        # 创建标签
        self.label = QLabel(self)
        self.label.resize(100, 100)
        self.label.setStyleSheet("background-color: cyan;")
​
        # 自定义鼠标样式
        pixmap = QPixmap("cursor.png").scaled(50, 50)
        cursor = QCursor(pixmap)
        self.setCursor(cursor)
​
​
    def mouseMoveEvent(self, event):
        """
        当鼠标移动时设置 Label 标签跟随鼠标移动
        """
        x = int(event.localPos().x() - (self.label.width() // 2))
        y = int(event.localPos().y() - (self.label.height() // 2))
        self.label.move(x, y)
​
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)
# 2. 控件操作
window = MyWidget()
# 3. 展示控件
window.show()
# 4. 应用程序的执行,进入到消息循环
sys.exit(app.exec_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue17 :: Hack3rX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值