Qt的跨平台自定义光标,资源文件中的光标

4

我感觉似乎缺少了什么,因为我没有找到任何一种在Qt中轻松实现跨平台光标的方法。也就是说,我想使用标准的光标编辑器或者常见的光标文件类型,并将其放入资源文件中。

我看到有一些特定于平台的方法提供句柄(这意味着我无法从资源中加载),或者一种通用的方式需要一个像素图。对于像素图方法,我还需要找到一种方法来存储与像素图相关的热点。

我不想要动画光标,只需要一个普通的颜色图像(32x32)。

最简单的处理方法是什么?


没有“标准”的跨平台光标文件。每个操作系统都以不同的方式实现光标。如果需要,您将不得不在运行时从位图创建光标。不知道Qt是否内置了这样的功能。 - Cody Gray
但是大多数平台(以及我所有的目标)都对光标有相同的支持。我没有问题将PNG放入资源文件中,但是我需要一种指定其热点的方法。 - edA-qa mort-ora-y
1
你尝试过使用带有位图和热点的QCursor构造函数吗?在文档中是第三个:http://doc.qt.nokia.com/latest/qcursor.html 如果你想要一个像素图,那就是第四个。还有QCursor::setPos(int x, int y)可以让你设置QCursor对象的热点。这对你不起作用吗? - Cody Gray
这些函数当然是有效的,我的问题是资产管理方面的。我需要一些方法来维护热点:存储在各种光标文件格式中的某些内容。 - edA-qa mort-ora-y
1个回答

10

我目前正在开发一个应用程序,希望有些漂亮的自定义光标。我的做法是:

  • 将图像添加到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.

热点是鼠标指针的一个非常重要的部分,它告诉您的应用程序哪个部分是“触发器”,也就是执行某些操作的位置,与其余部分相比仅仅是华丽的视觉效果而已。

enter image description here

在寻找有关 Qt 自定义光标资源的信息时,我发现了这篇文章(上面的图片来自该文章),我完全可以向每一位对此感兴趣的人推荐阅读。

关于存储热点的问题,我不认为这样做是必要的。毕竟,您的资源文件已经被编译并添加到二进制文件中,因此当您在代码中为光标分配热点时,它就已经存在了。我怀疑任何操作系统实际上都没有一个格式(更不用说跨平台的了),可以同时存储光标和其热点,因为根据应用程序的不同,您可能需要更改热点(例如由于缩放位图本身以便拥有多种大小),如果将其绑定到光标的位图上,这将更加困难。如果您真的想要走得更远(我建议不要这样做),可以创建自己的自定义文件格式,其中包含两者。由于 Qt 资源文件据我所知是用于管理图像的,因此您必须实现整个 IO 机制以支持您的自定义格式。

希望这能帮到您。上述解决方案是使用 Qt 框架时可获得的跨平台性最强的解决方案。但请注意,自定义的QCursor仅在您的应用程序内及其所设置的位置可用。例如,位于窗口框架上方的光标被视为特定于操作系统,因为窗口框架本身是一个特定于操作系统的功能,如果您想要更改其行为,就必须深入了解(也超出了 Qt 的安全区域),即检查操作系统级别上如何处理光标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接