Проблема с настройкой цвета курсора в QCursor - PullRequest
1 голос
/ 24 апреля 2020

C ++ == язык.

Библиотека QT.

Использование библиотеки qt У меня возникают трудности с определением, как именно я могу go изменить цвет курсора для моего пользовательского интерфейса с помощью растрового изображения или каким-либо другим способом. Любые предложения будут великолепны!

Спасибо за ваше время.

1 Ответ

1 голос
/ 24 апреля 2020

Чтобы изменить форму курсора или даже использовать пользовательские курсоры, можно использовать QCursor .

Он предоставляет различные конструкторы для создания курсоров различными способами. :

QCursor :: QCursor (const QPixmap & pixmap, int hotX = -1, int hotY = -1)

Конструкции пользовательский растровый курсор.

растровое изображение - это изображение. Обычно ему присваивается маска (устанавливается с помощью QPixmap :: setMask ()). hotX и hotY определяют горячую точку курсора.

Если hotX отрицательно, для него устанавливается pixmap (). width () / 2. Если значение hotY отрицательное, для него устанавливается значение pixmap (). Height () / 2.

Допустимые размеры курсора зависят от аппаратного обеспечения дисплея (или базовой оконной системы). Мы рекомендуем использовать курсоры 32 x 32, потому что этот размер поддерживается на всех платформах. Некоторые платформы также поддерживают курсоры 16 x 16, 48 x 48 и 64 x 64.

См. Также QPixmap :: QPixmap () и QPixmap: : setMask () .


QCursor :: QCursor (const QBitmap & bitmap, const QBitmap & mask, int hotX = -1, int hotY = -1)

Создает пользовательский растровый курсор.

растровое изображение и маска составляют растровое изображение. hotX и hotY определяют горячую точку курсора.

Если hotX отрицательно, для него устанавливается значение bitmap (). width () / 2. Если значение hotY отрицательное, для него устанавливается значение bitmap (). Height () / 2.

Битовая карта курсора (B) и биты маски (M) объединяются следующим образом:

  • B = 1 и M = 1 дает черный цвет.
  • B = 0 и M = 1 дает белый цвет.
  • B = 0 и M = 0 дает прозрачный.
  • B = 1 и M = 0 дают результат XOR в Windows, неопределенные результаты на всех других платформах.

Используйте глобальный Qt color Qt :: color0 для рисования 0-пикселей и Qt :: color1 для рисования 1 пикселя в растровых изображениях.

Допустимые размеры курсора зависят от аппаратного обеспечения дисплея (или базовой оконной системы). Мы рекомендуем использовать курсоры 32 x 32, потому что этот размер поддерживается на всех платформах. Некоторые платформы также поддерживают курсоры 16 x 16, 48 x 48 и 64 x 64.

См. Также QBitmap :: QBitmap () и QBitmap: : setMask () .


QCursor :: QCursor (форма Qt :: CursorShape)

Создает курсор с помощью указанную форму.

См. Qt :: CursorShape для списка фигур.

Итак, для цветного пользовательского курсора конструктор с необходимо использовать растровое изображение.

С QWidget :: setCursor () пользовательский курсор может быть применен к указанному c виджету.

Я подготовил MCVE для демонстрации различных типов курсоров - testQCursorShape.cc:

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup data
#if 0 // bitmap bits
  const quint32 bitmap[32] = {
    //|0  |4  |8  |12 |16 |20 |24 |28 |32
    0b00000000000000000000000000000000,//- 0
    0b00000000000000000001000000000100,//
    0b00000000000000000011100000001110,//
    0b00000000000000000001110000011100,//
    0b00000000000000000000111000111000,//- 4
    0b00000000000000000000011101110000,//
    0b00000000000000000000001111100000,//
    0b00000000000000000000000111000000,//
    0b00000000000000000000001111100000,//- 8
    0b00000000000000000000011101110000,//
    0b00000000000000000000111000111000,//
    0b00000000000000000001110000011100,//
    0b00000000000000000011100000001110,//- 12
    0b00000000000000000001000000000100,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 16
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 20
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 24
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 28
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
  };
  const quint32 mask[32] = {
    //|0  |4  |8  |12 |16 |20 |24 |28 |32
    0b00000000000000000001000000000100,//- 0
    0b00000000000000000011100000001110,//
    0b00000000000000000111110000011111,//
    0b00000000000000000011111000111110,//
    0b00000000000000000001111101111100,//- 4
    0b00000000000000000000111111111000,//
    0b00000000000000000000011111110000,//
    0b00000000000000000000001111100000,//
    0b00000000000000000000011111110000,//- 8
    0b00000000000000000000111111111000,//
    0b00000000000000000001111101111100,//
    0b00000000000000000011111000111110,//
    0b00000000000000000111110000011111,//- 12
    0b00000000000000000011100000001110,//
    0b00000000000000000001000000000100,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 16
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 20
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 24
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//- 28
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
    0b00000000000000000000000000000000,//
  };
#endif // 0
  const quint32 bitmap[32] = {
    0x00000000,
    0x00001004,
    0x0000380e,
    0x00001c1c,
    0x00000e38,
    0x00000770,
    0x000003e0,
    0x000001c0,
    0x000003e0,
    0x00000770,
    0x00000e38,
    0x00001c1c,
    0x0000380e,
    0x00001004,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
  };
  const quint32 mask[32] = {
    0x00001004,
    0x0000380e,
    0x00007c1f,
    0x00003e3e,
    0x00001f7c,
    0x00000ff8,
    0x000007f0,
    0x000003e0,
    0x000007f0,
    0x00000ff8,
    0x00001f7c,
    0x00003e3e,
    0x00007c1f,
    0x0000380e,
    0x00001004,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
    0x00000000,
  };
  // setup GUI
  // bit map cursor
  const QBitmap qBitmap
    = QBitmap::fromData(QSize(32, 32), (const uchar*)bitmap);
  const QBitmap qBitmapMask
    = QBitmap::fromData(QSize(32, 32), (const uchar*)mask);
  const QCursor qCursorBitmap(qBitmap, qBitmapMask, 7, 7);
  // pixmap cursor
  const QPixmap qPixmap("pencil.png");
  const QCursor qCursorPixmap(qPixmap, 2, 30);
  enum {
    TypeDefault, TypeShape, TypeBitmap, TypePixmap
  };
  // main window
  QWidget qWinMain;
  qWinMain.setWindowTitle(QString::fromUtf8("Test Custom Cursor Shape"));
  QGridLayout qGrid;
  QButtonGroup qTglGrp;
  QRadioButton qTglCursorDefault("Default");
  qTglCursorDefault.setChecked(true);
  qTglGrp.addButton(&qTglCursorDefault, TypeDefault);
  qGrid.addWidget(&qTglCursorDefault, 0, 0);
  QRadioButton qTglCursorShape("Cursor with QCursorShape");
  qTglGrp.addButton(&qTglCursorShape, TypeShape);
  qGrid.addWidget(&qTglCursorShape, 1, 0);
  QRadioButton qTglCursorBitmap("Bitmap Cursor");
  qTglGrp.addButton(&qTglCursorBitmap, TypeBitmap);
  qGrid.addWidget(&qTglCursorBitmap, 2, 0);
  QRadioButton qTglCursorPixmap("Pixmap Cursor");
  qTglGrp.addButton(&qTglCursorPixmap, TypePixmap);
  qGrid.addWidget(&qTglCursorPixmap, 3, 0);
  QFrame qFrmTest;
  qFrmTest.setFrameStyle(QFrame::Panel | QFrame::Sunken);
  qFrmTest.setFixedSize(256, 256);
  qGrid.addWidget(&qFrmTest, 0, 1, 5, 1);
  qWinMain.setLayout(&qGrid);
  // install signal handlers
  QObject::connect(&qTglGrp, QOverload<int>::of(&QButtonGroup::buttonClicked),
    [&](int choice) {
      switch (choice) {
        default:
        case TypeDefault: qFrmTest.unsetCursor(); break;
        case TypeShape: qFrmTest.setCursor(Qt::PointingHandCursor); break;
        case TypeBitmap: qFrmTest.setCursor(qCursorBitmap); break;
        case TypePixmap: qFrmTest.setCursor(qCursorPixmap); break;
      }
    });
  qWinMain.show();
  // runtime loop
  return app.exec();
}

A CMakeLists.txt для приготовления VS-решения:

project(QCursorShape)

cmake_minimum_required(VERSION 3.10.0)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(Qt5Widgets CONFIG REQUIRED)

include_directories("${CMAKE_SOURCE_DIR}")

add_executable(testQCursorShape testQCursorShape.cc)

target_link_libraries(testQCursorShape Qt5::Widgets)

и использованных файл изображения pencil.png, подготовленный с альфа-каналом (для прозрачности):

pencil.png

Скомпилировано и протестировано с VS2017 и Qt 5.13 (on * 1117) * 10):

animated snapshot of testQCursorShape

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...