Система событий Qt: события мыши и события колеса

1. QMouseEvent - событие мыши

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

  • QMouseEvent в Qt обычно включает только такие операции, как нажатие мыши, отпускание мыши и перемещение указателя мыши, в то время как QWheeEvent обрабатывает реакцию на колесико мыши.
  • События Mousemove будут происходить только при нажатии кнопки мыши, если они не вызываются явно.
  • QWidget::setMouseTracking() для включения отслеживания мыши.В этом случае, пока указатель мыши движется, будет генерироваться серия событий мыши Qt.

Доставка QMouseEvent

Несколько перекрывающихся окон похожи на рекурсивное перевернутое дерево в реализации.Событие мыши будет проходить вверх по связанному списку родительского окна, где находится указатель мыши, пока окно не вызовет функцию accept() для обработки события, в противном случае событие будет фильтровать уничтожить его.

  • Если вы хотите, чтобы родительское окно, в котором находится указатель мыши, не получало событие, вы можете вызвать функцию ignore(), чтобы игнорировать его.
  • Если событие мыши доставлено в окно, в котором находится указатель мыши, и бит QT::WA_NoMousePropagation этого окна равен TRUE, событие не будет передано через родительское окно.
  • Вы можете использовать QWidget::setEnabled() для включения/отключения того, принимает ли соответствующее окно события клавиатуры и мыши.

экземпляр события мыши

При использовании события мыши добавьте заголовочный файл <QMouseEvent>, а затем перепишите эти функции в заголовочный файл:

#include <QMouseEvent>

protected:
	// 鼠标按下事件
    void mousePressEvent(QMouseEvent * event);
    // 鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *event);
    // 鼠标移动事件
    void mouseMoveEvent(QMouseEvent *event);

Затем нужно реализовать определенную логику в исходном файле:

// 鼠标按下事件
void MainWindow::mousePressEvent(QMouseEvent * event)
{
    if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左键按下" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右键按下" ;
    }
    
    // 获取按下时的鼠标指针坐标
    qDebug() << event->x() << ":" << event->y();    
}

// 鼠标释放事件
void myMouseEvent::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左键释放" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右键释放" ;
    }

    // 获取释放时的鼠标指针坐标
    qDebug() << "release:" << event->x() << " " << event->y();
}

// 鼠标移动事件
void myMouseEvent::mouseMoveEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        qDebug() << "左键移动" ;
    }
    else if(event->button() == Qt::RightButton)
    {
        qDebug() << "右键移动" ;
    }

    // 获取移动过程中的鼠标指针坐标
    qDebug() << "move:" << event->x() << " " << event->y();
}

Вывод выглядит следующим образом:

15:49:08: Starting F:\Project\C++ Project\Qt\build-myMouseEvent-Desktop_Qt_5_9_7_MinGW_32bit-Debug\debug\myMouseEvent...
左键按下
press: 96   75
左键释放
release: 100   98
move: 75   81
move: 76   81    

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

Общие функции-члены QMouseEvent

  • globalPos(): возвращает значение глобальной координаты указателя мыши (тип QPoint), то есть значение координаты относительно экрана ПК, а не относительно текущего открытого окна;
  • globalX(): возвращает значение X глобальных координат указателя мыши, когда происходит событие мыши;
  • globalY(): возвращает значение Y глобальных координат указателя мыши, когда происходит событие мыши;
  • pos(): возвращает относительное положение указателя мыши и окна, которое получает событие мыши, где значение координат является целым числом;
  • posF(): возвращает относительное положение указателя мыши в окне, которое получает событие мыши, а значение координат представлено типом с плавающей запятой для повышения точности.

Два, QWheelEvent - событие колеса

Класс QWheelEvent используется для представления события колесика мыши, включая связанные параметры, используемые для описания события колесика мыши. Прототип функции:

QWheelEvent::QWheelEvent(const QPoint &pos, int delta, Qt::MouseButtons buttons,Qt::KeyboardModifiers modifiers, Qt::Orientation orient = Qt::Vertical )

Функции и параметры:

/*** 创建一个wheelEvent对象, ***/
(1)参数pos代表鼠标指针在窗口中的当前位置,通常用globalPos()初始化QCursor::pos(),但并不总是正确的。如果需要显示指定一个全局位置,可以用其他的构造函数;
(2)参数button用于描述在鼠标事件过程中鼠标按键的状态(state);
(3)delta()可以返回滑动的距离,正数值表示滑轮相对于用户在向前滑动,相反,负数值表示滑轮相对于用户是向后滑动的。;
(4)参数modifiers用于描述在鼠标事件中鼠标状态位改变时的参数值(比如鼠标的左中右按键的切换);
(5)参数orient用于指示鼠标滑轮滚动的方向(水平或者垂直)。

Примеры следующие:

// 滚轮事件
void myMouseEvent::wheelEvent(QWheelEvent *event)
{
    if(event->delta() > 0) // 当滚轮向上滑,远离使用者
    {
        ui->textEdit->zoomIn(); // 进行放大,textEdit的光标和字体都放大
    }
    else // 当滚轮向下滑,靠近使用者
    {
        ui->textEdit->zoomOut(); // 进行缩小,textEdit的光标和字体都缩小
    }
}

Пользователь перемещает мышь вверх, чтобы увеличить масштаб, и перемещает мышь вниз, чтобы уменьшить масштаб.

Преимущества этой статьи: бесплатный пакет учебных материалов по разработке Qt, техническое видео, в том числе (основа языка C++, введение в программирование Qt, механизм сигналов и слотов QT, рисование изображения разработки интерфейса QT, сеть QT, программирование базы данных QT, QT проектный бой, QSS, OpenCV, быстрый модуль, вопросы для интервью и т. д.) ↓↓↓↓↓↓См. ниже↓↓Нажмите внизу статьи, чтобы получить гонорар↓↓

おすすめ

転載: blog.csdn.net/QtCompany/article/details/131743487