События мыши

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

Нажатие и отпускание кнопки мыши

При нажатии и отпускании кнопки мыши вызываются следующие методы:

  • mousePressEvent() — вызывается при нажатии кнопки мыши. Прототип метода:
virtual void mousePressEvent(QMouseEvent *event)
  • mouseReleaseEvent() — вызывается при отпускании ранее нажатой кнопки мыши. Прототип метода:
virtual void mouseReleaseEvent(QMouseEvent *event)
  • mouseDoubleClickEvent() — вызывается при двойном щелчке мышью в области компонента. Прототип метода:
virtual void mouseDoubleClickEvent(QMouseEvent *event)

Следует учитывать, что двойному щелчку предшествуют другие события. Последовательность событий при двойном щелчке выглядит так:

Событие MouseButtonPress
Событие MouseButtonRelease
Событие MouseButtonDblClick
Событие MouseButtonPress
Событие MouseButtonRelease

Задать интервал двойного щелчка позволяет метод setDoubleClickInterval() из класса QApplication. Получить текущее значение интервала можно с помощью метода doubleClickInterval(). Прототипы методов:

void setDoubleClickInterval(int)
int doubleClickInterval()

Через параметр доступен экземпляр класса QMouseEvent, который позволяет получить дополнительную информацию о событии. Класс QMouseEvent содержит следующие методы:

  • position() — возвращает экземпляр класса QPointF с вещественными координатами в пределах области компонента. Прототип метода:
QPointF position() const
  • scenePosition() — возвращает координаты относительно окна или сцены. Прототип метода:
QPointF scenePosition() const
  • globalPosition() — возвращает экземпляр класса QPointF с координатами в пределах экрана. Прототип метода:
QPointF globalPosition() const
  • button() — позволяет определить, какая кнопка мыши вызвала событие. Прототип метода:
Qt::MouseButton button() const

Возвращает значение одной из следующих констант:

  • Qt::NoButton — кнопки не нажаты. Это значение возвращается методом button() при перемещении указателя мыши;
  • Qt::LeftButton — нажата левая кнопка мыши;
  • Qt::RightButton — нажата правая кнопка мыши;
  • Qt::MiddleButton — нажата средняя кнопка мыши;
  • buttons() — позволяет определить все кнопки, которые нажаты одновременно. Возвращает комбинацию значений атрибутов Qt::LeftButton, Qt::RightButton и Qt::MiddleButton. Прототип метода:
Qt::MouseButtons buttons() const

Пример определения кнопки мыши:

if (e->buttons() & Qt::LeftButton) {
   qDebug() << "Нажата левая кнопка мыши";
}
  • modifiers() — позволяет определить, какие клавиши-модификаторы (<Shift>, <Ctrl>, <Alt> и др.) были нажаты вместе с кнопкой мыши. Возможные значения мы уже рассматривали в разд. 4.8.3. Прототип метода:
Qt::KeyboardModifiers modifiers() const

Если событие обработано, то нужно вызвать метод accept() через объект события. Чтобы родительский компонент мог получить событие, вместо метода accept() необходимо вызвать метод ignore().

Если для компонента константа Qt::WA_NoMousePropagation установлена в истинное значение, то событие мыши не будет передаваться родительскому компоненту. Значение атрибута можно изменить с помощью метода setAttribute():

setAttribute(Qt::WA_NoMousePropagation, true);

По умолчанию событие мыши перехватывает компонент, над которым произведен щелчок мышью. Чтобы перехватывать нажатие и отпускание мыши вне компонента следует захватить мышь с помощью метода grabMouse(). Освободить захваченную ранее мышь позволяет метод releaseMouse(). Прототипы методов:

void grabMouse()
void grabMouse(const QCursor &cursor)
void releaseMouse()

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов