我感觉似乎缺少了什么,因为我没有找到任何一种在Qt中轻松实现跨平台光标的方法。也就是说,我想使用标准的光标编辑器或者常见的光标文件类型,并将其放入资源文件中。
我看到有一些特定于平台的方法提供句柄(这意味着我无法从资源中加载),或者一种通用的方式需要一个像素图。对于像素图方法,我还需要找到一种方法来存储与像素图相关的热点。
我不想要动画光标,只需要一个普通的颜色图像(32x32)。
最简单的处理方法是什么?
我感觉似乎缺少了什么,因为我没有找到任何一种在Qt中轻松实现跨平台光标的方法。也就是说,我想使用标准的光标编辑器或者常见的光标文件类型,并将其放入资源文件中。
我看到有一些特定于平台的方法提供句柄(这意味着我无法从资源中加载),或者一种通用的方式需要一个像素图。对于像素图方法,我还需要找到一种方法来存储与像素图相关的热点。
我不想要动画光标,只需要一个普通的颜色图像(32x32)。
最简单的处理方法是什么?
我目前正在开发一个应用程序,希望有些漂亮的自定义光标。我的做法是:
将图像添加到Qt资源文件(*.qrc
)- 我使用带有透明度的PNG从SVG导出(始终将原始艺术来源保存为SVG,以防需要缩放等操作)
<RCC>
<qresource prefix="/">
<file alias="default">cursors/cursor_default.png</file>
</qresource>
</RCC>
这将允许您将光标与应用程序一起打包,因为Qt资源文件会被转换为C++源代码,然后添加到您的二进制文件中。
在您的源代码中执行以下操作:
QPixmap cursor_pixmap = QPixmap(":cursor_default");
QCursor cursor_default = QCursor(cursor_pixmap, 0, 0);
setCursor(cursor_default);
这里有两个重要的事情需要注意,都与 QCursor
的构造函数相关——你添加到它的像素图和热点坐标(这里都设置为 0
,即代表光标形状的像素图的左上角)。实际上,QCursor
有两个构造函数,在我看来在这里是很有用的:
- `QCursor::QCursor(const QBitmap &bitmap, const QBitmap &mask, int hotX = -1, int hotY = -1)` - this allows you to use a mask to manipulate the pixels of your cursor
- `QCursor::QCursor(const QPixmap &pixmap, int hotX = -1, int hotY = -1)` - if you are working with a PNG or other supported image format which allows transparency you can omit the mask as it is in my case.
热点是鼠标指针的一个非常重要的部分,它告诉您的应用程序哪个部分是“触发器”,也就是执行某些操作的位置,与其余部分相比仅仅是华丽的视觉效果而已。
在寻找有关 Qt 自定义光标资源的信息时,我发现了这篇文章(上面的图片来自该文章),我完全可以向每一位对此感兴趣的人推荐阅读。
关于存储热点的问题,我不认为这样做是必要的。毕竟,您的资源文件已经被编译并添加到二进制文件中,因此当您在代码中为光标分配热点时,它就已经存在了。我怀疑任何操作系统实际上都没有一个格式(更不用说跨平台的了),可以同时存储光标和其热点,因为根据应用程序的不同,您可能需要更改热点(例如由于缩放位图本身以便拥有多种大小),如果将其绑定到光标的位图上,这将更加困难。如果您真的想要走得更远(我建议不要这样做),可以创建自己的自定义文件格式,其中包含两者。由于 Qt 资源文件据我所知是用于管理图像的,因此您必须实现整个 IO 机制以支持您的自定义格式。
希望这能帮到您。上述解决方案是使用 Qt 框架时可获得的跨平台性最强的解决方案。但请注意,自定义的QCursor
仅在您的应用程序内及其所设置的位置可用。例如,位于窗口框架上方的光标被视为特定于操作系统,因为窗口框架本身是一个特定于操作系统的功能,如果您想要更改其行为,就必须深入了解(也超出了 Qt 的安全区域),即检查操作系统级别上如何处理光标。
QCursor
构造函数吗?在文档中是第三个:http://doc.qt.nokia.com/latest/qcursor.html 如果你想要一个像素图,那就是第四个。还有QCursor::setPos(int x, int y)
可以让你设置QCursor对象的热点。这对你不起作用吗? - Cody Gray