4

我觉得我错过了一些东西,因为我看不到任何方法可以轻松地在 Qt 中进行跨平台游标。也就是说,我想使用一个标准的光标编辑器,或者只是一个普通的光标文件类型,并将其粘贴到资源文件中。

我看到一些特定于平台的方式提供句柄(意味着我无法从资源加载)或采用像素图的通用方式。在像素图方法中,我必须找到某种方式来存储热点和像素图。

我不想要动画光标,只想要一个纯色图像(32x32)。

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

4

1 回答 1

8

我目前正在开发一个我想要一些不错的自定义光标的应用程序。我这样做的方式是:

  • 将图像添加到 Qt 资源文件 ( *.qrc) - 我正在使用从 SVG 导出的透明度 PNG

     <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代表光标形状的像素图的左上角)。实际上有2个构造函数在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 框架一样是跨平台的。但是请注意,自定义QCursor仅在您的应用程序内部以及您设置它的任何位置可用。例如,窗口框架上方的光标被认为是特定于操作系统的,因为窗口框架本身是特定于操作系统的功能,并且如果你想改变它的行为,你将不得不更深入(并且也在 Qt 的安全区域之外),这意味着检查游标是如何在操作系统级别上处理的。

于 2016-03-28T13:46:17.807 回答