QCursor设置光标颜色时遇到的问题

C++ ==语言。

QT库。

在使用qt库时,我遇到了麻烦,不知道到底该如何用位图或其他方法来改变UI的光标颜色。 任何建议都将是很棒的!

谢谢你的时间。

解决方案:

要改变光标的形状,甚至使用自定义光标。QC游标 可以使用。

它提供了多种构造函数来以不同的方式创建游标。

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

构造一个自定义的像素图光标。

pixmap是图像,通常给它一个遮罩(使用QPixmap::setMask()设置)。通常给它一个掩码(使用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)

构造一个自定义的位图光标。

bitmap和mask组成位图,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在Windows下给出一个XOR’d的结果,在所有其他平台上给出未定义的结果。

在位图中使用全局Qt颜色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 shape)

用指定的形状构造一个游标。

参见 Qt::CursorShape 的形状列表。

所以,对于一个彩色的自定义光标,必须使用带有pixmap的构造函数。

使用 QWidget::setCursor()可以将自定义光标应用于一个特定的部件。

我准备了一个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 其中准备了一个alpha通道(用于透明度)。

pencil.png

用VS2017和Qt 5.13编译和测试(在Windows 10上)。

animated snapshot of testQCursorShape

给TA打赏
共{{data.count}}人
人已打赏
未分类

为什么这个算法不能找到有向无环图中最长的路径?

2022-9-8 17:25:21

未分类

我尝试请求发布帖子,但错误的是无效的URI " " Rest API。

2022-9-8 17:36:17

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索