🌟想系统化学习 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_())