Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt的跨平台自定义游标,资源文件中的游标_Qt_Custom Cursor - Fatal编程技术网

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

Qt的跨平台自定义游标,资源文件中的游标,qt,custom-cursor,Qt,Custom Cursor,我觉得我遗漏了一些东西,因为我看不到任何方法可以轻松地在Qt中执行跨平台游标。也就是说,我想使用一个标准的游标编辑器,或者只是一个普通的游标文件类型,并将其粘贴到资源文件中 我看到一些特定于平台的方式提供了句柄(这意味着我无法从资源加载),或者是一种使用pixmap的通用方式。在pixmap方法中,我必须找到某种方法来存储热点和pixmap 我不想要动画光标,只是一个普通的彩色图像(32x32) 处理这个问题最简单的方法是什么?我目前正在开发一个应用程序,希望有一些好的自定义游标。我这样做的方式

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

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

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


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

我目前正在开发一个应用程序,希望有一些好的自定义游标。我这样做的方式是:

  • 将图像添加到Qt资源文件(
    *.qrc
    )-我正在使用从SVG导出的透明度的PNG(如果需要缩放,请始终使用SVG中的原始艺术源)

这里有两件重要的事情需要注意,它们都与
QCursor
的构造器相关-添加到其中的pixmap和热点坐标(这里都设置为
0
,这是代表光标形状的pixmap的左上角)。实际上,
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的安全区),这意味着检查如何在操作系统级别处理光标。

没有“标准”跨平台游标文件。每个操作系统实现游标的方式不同。如果需要,您必须在运行时从位图创建光标。不知道Qt中是否内置了这样的功能。但是大多数平台(以及我的所有目标)对游标都有相同的支持。我在资源文件中粘贴PNG没有问题,但是我需要一些方法来指定它的热点。您是否尝试过使用位图和热点的
QCursor
构造函数?文档中的第三个问题:如果你想要一个pixmap,那就是第四个问题。还有
QCursor::setPos(intx,inty)
允许您为QCursor对象设置热点。这对你不管用吗?这些功能当然管用,我的问题是资产管理。我需要一些方法来维护热点:一些存储在各种游标文件格式中的东西。
 QPixmap cursor_pixmap = QPixmap(":cursor_default");
 QCursor cursor_default = QCursor(cursor_pixmap, 0, 0);
 setCursor(cursor_default);
- `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.