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

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

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

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

最佳答案

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

  • 将图像添加到 Qt 资源文件 (*.qrc) - 我正在使用从 SVG 导出的透明度的 PNG(总是在 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 实际上有 2 个构造函数,在这里恕我直言很有用:
    - `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的跨平台自定义游标,资源文件中的游标-LMLPHP
    在寻找有关 Qt 自定义光标的资源时,我找到了 this article(上图来自它),我完全可以推荐每个对此主题感兴趣的人阅读。
    在存储热点方面,我认为没有必要这样做。在你的所有资源文件被编译并添加到二进制文件之后,当你为代码中的游标分配一个热点时,它就会在那里。我怀疑任何操作系统实际上都有一种存储光标及其热点的格式(更不用说多平台了),因为根据应用程序您可能想要更改热点(例如由于缩放位图本身)为了有多种尺寸)如果你把它绑定(bind)到光标的位图,这会困难得多。如果您真的想与此保持距离(我建议您不要这样做),您可以创建自己的自定义文件格式,其中包含两者。由于 Qt 资源文件 - 据我所知 - 用于管理图像,因此您必须实现整个 IO 机制以支持您的自定义格式。
    希望这可以帮助。上面的解决方案与 Qt 框架一样跨平台。但是请注意,自定义 QCursor 仅在您的应用程序内以及您设置它的任何位置可用。例如,位于窗口框架上方的光标被认为是特定于操作系统的,因为窗口框架本身是特定于操作系统的功能如果你想改变它的行为,你将不得不更深入(并且也在 Qt 的安全区之外),这意味着检查游标在操作系统级别上是如何处理的。

    关于qt - Qt的跨平台自定义游标,资源文件中的游标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5455584/

    10-12 12:37
    查看更多