Шаг 21.
Библиотека Qt.
Изменение указателя мыши

    На этом шаге рассмотрим изменение вида указателя мыши.

    Класс указателя (курсора) мыши QCursor определен в файле QCursor (#include <QCursor>, qmake: QT += gui).

    Указатель представляет собой небольшую растровую картинку, информирующую пользователя о позиции мыши на экране. В зависимости от местоположения, внешний вид указателя может меняться. В большинстве случаев это стрелка, но при попадании на границу окна он может превратиться в двунаправленную стрелку, информируя пользователя, что размеры окна могут быть изменены.

    Установить изображение указателя можно методом setCursor(), передав ему одно из указанных в табл. 1 значений.

Таблица 1. Значения CursorShape пространства имен Qt
Вид
Значение
Описание
Qt::ArrowCursor
Стандартный указатель стрелки, появляется поверх большинства виджетов. Служит для указания, выбора или перемещения мыши
Qt::UpArrowCursor
Стрелка показывающая вверх. Применение этого указателя зависит от конкретной ситуации
Qt::CrossCursor
Крестообразный указатель используется для выделения прямоугольных областей. Может появиться над любым виджетом, допускающим эту операцию
Qt::IBeamCursor
I-образный текстовый указатель (I-beam cursor) представляет собой вертикальную линию. Появляется над текстом для изменения, выбора и перемещения
Qt::WaitCursor
Указатель ожидания, появляется над любым виджетом или позицией при выполнении операции в фоновом режиме
Qt::ForbiddenCursor
Указатель невозможности входа, появляется над объектом-приемником при проведении операций перетаскивания, сигнализируя о том, что принимающая сторона не в состоянии принять перетаскиваемый объект
Qt::PointingHandCursor
Указатель в виде руки появляется над гипертекстовыми ссылками
Qt::WhatsThisCursor
Указатель с вопросом, появляется поверх большинства виджетов для получения контекстно-зависимой помощи
Qt::SizeVerCursor
Указатель изменения вертикального размера окна. Появляется поверх регулируемой границы окна
Qt::SizeHorCursor
Указатель изменения горизонтального размера окна. Появляется поверх регулируемой границы окна
Qt::SizeBDiagCursor
Указатель изменения размеров окна по диагонали. Появляется поверх регулируемой границы окна
Qt::SizeFDiagCursor
Указатель изменения размеров окна по диагонали. Появляется поверх регулируемой границы окна
Qt::SizeAllCursor
Указатель для изменения местоположения окна, сигнализирует о готовности окна быть перемещенным
Qt::SplitVCursor
Указатель изменения высоты для разделенных виджетов, появляется над границей между двумя разделенными виджетами.
Qt::SplitHCursor
Указатель изменения ширины для разделенных виджетов, появляется над границей между двумя разделенными виджетами.
Qt::OpenHandCursor
Указатель в виде разжатой руки сигнализирует о возможности перемещения частей изображения в видимой области
Qt::ClosedHandCursor
Указатель в виде сжатой руки сигнализирует о готовности перемещения частей изображения в видимой области


Примечание. Вызов статического метода QApplication::setOverrideCursor() устанавливает изображение указателя для всего приложения. Это может понадобиться, например, для информирования пользователя о том, что приложение выполняет интенсивную, продолжительную по времени операцию и не в состоянии реагировать на команды. В этот момент все виджеты должны отображать указатель мыши в виде песочных часов, для чего вызывается метод QApplication::setOverrideCursor(Qt::WaitCursor). Когда приложение снова будет в состоянии выполнять команды пользователя, вызовом статического метода QApplication:: restoreOverrideCursor() указателю мыши возвращается его прежний вид.

    В классе QCursor содержится метод pos(), который возвращает текущую позицию указателя мыши относительно левого верхнего угла экрана.

    При помощи метода setPos() можно пе-ремещать указатель мыши.

    Чтобы создать собственное изображение указателя мыши, нужны два растровых изображения типа QBitmap. Эти изображения должны иметь одинаковые размеры, а одно из них будет представлять собой битовую маску. В тех местах, на которых маска будет иметь цвет color1, будет нарисовано само изображение указателя, а в местах, где маска будет иметь цвет color0 — изображение будет прозрачно.

    Более простой способ — это использование объекта класса QPixmap. Результат выполнения программы, показанный на рис. 1, демонстрирует эту возможность.


Рис.1. Использование собственного изображения для указателя мыши

    Это приложение можно взять здесь.

    Для реализации приложения, показанного на рис. 1, сначала создается виджет wgt, затем — объект растрового изображения pix, в конструктор которого передается имя png-файла, представляющего собой растровое изображение и битовую маску. Для создания указателя мыши объект растрового изображения передается в конструктор класса QCursor и с помощью метода setCursor() устанавливается в виджете. В итоге должно получиться следующее:

#include <QApplication>
#include <QWidget>
#include <QCursor>
#include <QPixmap>

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QWidget *wgt=new QWidget;
    wgt->setWindowTitle("Курсор мыши");
    wgt->setWindowFlags(Qt::Window|Qt::WindowCloseButtonHint);
    QPixmap pix("clock.png");
    QCursor cur(pix);
    wgt->setCursor(cur);
    wgt->resize(180, 100);
    wgt->show();
    return app.exec();
} 

    На следующем шаге рассмотрим класс QStackedWidget.




Предыдущий шаг Содержание Следующий шаг