Кроссплатформенные пользовательские курсоры для Qt, курсор в файле ресурсов - PullRequest
3 голосов
/ 28 марта 2011

Я чувствую, что что-то упустил, так как не вижу способа легко сделать кроссплатформенный курсор в Qt.То есть я хотел бы использовать стандартный редактор курсоров или просто обычный тип файла курсора и вставить его в файл ресурсов.

Я вижу пару специфичных для платформы способов, предоставляющих дескрипторы (то есть я не мог 'загрузить из ресурса) или обычным способом, используя растровое изображение.В методе растровых изображений мне нужно было бы найти способ сохранить точку доступа вместе с растровым изображением.

Мне не нужны анимированные курсоры, только одноцветное изображение (32x32).

Чтосамый простой способ справиться с этим?

1 Ответ

5 голосов
/ 28 марта 2016

В настоящее время я работаю над приложением, в котором я хотел бы иметь несколько хороших пользовательских курсоров.Я делаю так:

  • Добавление изображения в файл ресурсов 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, которое является верхним левым углом растрового изображения, представляющего форму вашего курсора).На самом деле есть 2 конструктора для QCursor, которые мне очень полезны:

    • QCursor::QCursor(const QBitmap &bitmap, const QBitmap &mask, int hotX = -1, int hotY = -1) - это позволяет вам использовать маску для манипулирования пикселями вашего курсора
    • QCursor::QCursor(const QPixmap &pixmap, int hotX = -1, int hotY = -1) - если вы работаете с PNG или другим поддерживаемым форматом изображения, который обеспечивает прозрачность, вы можете опустить маску, как в моем случае.

Точка доступа очень важначасть курсора - она ​​сообщает вашему приложению, какая часть вашего курсора является «триггером», то есть точкой, которая делает что-то по сравнению с остальными, которые являются просто причудливыми визуальными элементами и ничего не работают.

enter image description here

При поиске ресурсов по настройке курсоров в Qt я нашел эту статью (изображение выше из нее), которую я могу полностью рекомендовать всем, кто интересуется этой темой,читай.

С точки зрения хранения точки доступа я не думаю, что что-то подобное необходимо.После того, как все ваши файлы ресурсов скомпилированы и добавлены в двоичный файл, следовательно, когда вы назначите горячую точку курсору внутри вашего кода, он будет там.Я сомневаюсь, что любая ОС на самом деле имеет формат (не говоря уже о мультиплатформенном), в котором хранятся курсор и его горячая точка, потому что в зависимости от приложения вы можете изменить горячую точку (например, из-за масштабирования самого растрового изображения).чтобы иметь несколько размеров), что было бы намного сложнее, если бы вы привязали его к битовой карте курсора.Если вы действительно хотите пройти путь с этим (я бы советовал против этого), вы можете создать свой собственный формат файла, который содержит оба.Поскольку файлы ресурсов Qt, насколько мне известно, предназначены для управления изображениями, вам потребуется реализовать всю механику ввода-вывода для поддержки вашего пользовательского формата.

Надеюсь, это поможет.Решение, приведенное выше, является кроссплатформенным, как вы можете получить с помощью инфраструктуры Qt.Однако обратите внимание, что пользовательский QCursor будет доступен только внутри вашего приложения и там, где вы его установили.Курсор, который находится над оконной рамкой, например, считается зависящим от ОС, потому что сама оконная рама является специфической особенностью ОС, и если вы хотите изменить ее поведение, вам придется пойти намного глубже (а также за пределы Qtбезопасная зона).

...