C ++ ==语言。
QT库。
使用qt库时,我很难确切地知道如何使用位图或其他方法为UI更改光标的颜色。任何建议都很棒!
谢谢您的时间。
答案 0 :(得分:1)
要更改光标形状甚至使用自定义光标,可以使用QCursor。
它提供了多种构造函数,以不同的方式创建游标:
QCursor::QCursor(const QPixmap &pixmap, int hotX = -1, int hotY = -1)
构造一个自定义像素图光标。
pixmap是图像。通常给它一个掩码(使用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给出Windows下的XOR结果,在所有其他平台上未定义结果。
在位图中使用全局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();
}
准备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通道准备)(用于透明):
使用VS2017和Qt 5.13(在Windows 10上)进行编译和测试: