QCursor
是 PyQt5 中用于处理鼠标光标的核心类,属于 PyQt5.QtGui
模块。它允许开发者控制应用程序中的光标形状、位置和自定义光标样式。以下是 QCursor
的详细介绍:
1. 基本功能
- 设置光标形状:提供多种预定义光标(如箭头、手型、等待等)。
- 获取/设置光标位置:全局(屏幕)或局部(窗口控件)光标位置。
- 自定义光标:通过图片或像素图创建自定义光标。
2. 常见用法
导入模块
python
from PyQt5.QtGui import QCursor
from PyQt5.QtCore import Qt
设置控件的光标形状
python
# 设置某个控件(如按钮)的光标为手型
button.setCursor(QCursor(Qt.PointingHandCursor))
设置全局光标形状
python
# 设置整个应用程序的光标为等待(沙漏)
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
# 恢复默认光标
QApplication.restoreOverrideCursor()
获取光标位置
python
# 获取全局(屏幕)光标位置
global_pos = QCursor.pos()
# 获取相对于某个控件的局部位置
local_pos = widget.mapFromGlobal(QCursor.pos())
设置光标位置
python
# 将光标移动到屏幕坐标 (100, 100)
QCursor.setPos(100, 100)
3. 预定义光标类型
QCursor
支持多种系统内置光标,通过 Qt.CursorShape
枚举值指定:
枚举值 | 说明 |
---|---|
Qt.ArrowCursor | 默认箭头 |
Qt.PointingHandCursor | 手型(链接或可点击元素) |
Qt.WaitCursor | 等待(沙漏或旋转圆圈) |
Qt.CrossCursor | 十字线(绘图工具) |
Qt.SizeAllCursor | 移动(四向箭头) |
Qt.IBeamCursor | 文本输入(I 型光标) |
Qt.ForbiddenCursor | 禁止操作(带斜杠的圆圈) |
完整列表参考 Qt文档。
4. 自定义光标
可以通过图片或像素图创建自定义光标:
使用图片文件(.cur
或 .png
)
python
from PyQt5.QtGui import QPixmap
# 加载图片并创建光标
pixmap = QPixmap("custom_cursor.png")
cursor = QCursor(pixmap, hotX=0, hotY=0) # hotX/Y 是光标热点位置(如箭头尖)
button.setCursor(cursor)
使用像素图(QBitmap
)
python
from PyQt5.QtGui import QBitmap, QCursor
# 创建黑白掩码(1位深度)
bitmap = QBitmap(32, 32) # 大小通常为 32x32
bitmap.fill(Qt.color0) # 透明部分
# ... 绘制自定义形状 ...
cursor = QCursor(bitmap, bitmap) # 掩码和自身相同
5. 注意事项
-
光标资源路径:
自定义光标时,图片路径需正确,否则会显示默认箭头。 -
跨平台兼容性:
- Windows 支持
.cur
和.ico
格式。 - Linux/macOS 可能需额外处理,建议测试多平台。
- Windows 支持
-
性能:
频繁切换光标可能影响用户体验,避免过度使用动画或复杂光标。 -
恢复默认光标:
使用QApplication.restoreOverrideCursor()
或widget.unsetCursor()
恢复。
6. 示例代码
动态切换光标
python
from PyQt5.QtWidgets import QApplication, QPushButton
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCursor
app = QApplication([])
button = QPushButton("Hover me!")
button.setCursor(QCursor(Qt.PointingHandCursor)) # 悬停时显示手型
# 点击时切换为等待光标
def on_click():
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
# 模拟耗时操作
import time
time.sleep(2)
QApplication.restoreOverrideCursor()
button.clicked.connect(on_click)
button.show()
app.exec_()
自定义光标图片
python
from PyQt5.QtWidgets import QLabel
from PyQt5.QtGui import QPixmap, QCursor
label = QLabel("Hover here for custom cursor")
pixmap = QPixmap("custom_cursor.png").scaled(32, 32) # 缩放为合适大小
label.setCursor(QCursor(pixmap, hotX=5, hotY=5)) # 热点位置根据图片调整
7. 常见问题
-
光标不生效:
确保控件未禁用(setEnabled(True)
),且未被父控件覆盖光标设置。 -
自定义光标颜色异常:
使用.cur
或.png
时确保图片背景透明。 -
Linux 兼容性:
部分桌面环境(如 GNOME/KDE)可能限制自定义光标,需测试目标平台。
掌握 QCursor
可以显著提升 GUI 应用的交互体验!