如何通过PyQt从.cur文件获取光标热点信息并设置
解决PyQt中从.cur文件提取光标热点的问题
直接使用QCursor的文件路径构造函数即可自动读取.cur文件中的热点信息,无需手动解析。
你的原代码通过QPixmap加载.cur文件再创建QCursor,这种方式会丢失光标文件自带的热点元数据——因为QPixmap仅处理图像像素数据,不会解析.cur格式的额外信息(比如热点坐标),所以默认将热点设为图像中心。
修改后的代码如下:
from PyQt5.QtWidgets import QWidget from PyQt5.QtGui import QCursor @staticmethod def setCursor(widget: QWidget, cursorIconPath: str): # 直接用文件路径构造QCursor,自动读取.cur文件的热点信息 widget.setCursor(QCursor(cursorIconPath))
原理说明
QCursor的构造函数支持直接传入光标文件路径(包括.cur格式),内部会解析.cur文件的完整结构,其中就包含热点坐标信息,这样设置的光标会完全遵循原文件的定义。
特殊场景补充(可选)
如果因为某些原因需要手动解析.cur文件的热点,可以通过struct模块读取文件头:
.cur文件的头部结构包含热点的x、y坐标(位于文件偏移量0xA和0xC的位置,各占2字节)。示例代码如下:
import struct def get_cursor_hotspot(cursor_path): with open(cursor_path, 'rb') as f: # 跳过前10字节的文件头标识 f.seek(10) # 读取热点x坐标(2字节小端) hot_x = struct.unpack('<H', f.read(2))[0] # 读取热点y坐标(2字节小端) f.seek(12) hot_y = struct.unpack('<H', f.read(2))[0] return (hot_x, hot_y)
之后可以用QCursor(QPixmap(cursor_path), hot_x, hot_y)来构造光标,但这种方式不如直接用QCursor(cursor_path)简洁可靠。
内容的提问来源于stack exchange,提问作者jayfunc
相关产品推荐
相关产品推荐

