Среда, 30 декабря 2020 12:28

Обработка нажатий кнопок мыши - Виджеты (компоненты) в Qt5.

Россия
Оцените материал
(0 голосов)

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

Обработку событий с помощью слотов и сигналов мы рассмотрим в следующей статье.

Добавление реакции на щелчок

В этой статье мы будем использовать проект из предыдущей статьи.

Допустим, нам нужно, чтобы по щелчку лампа меняла цвет, для этого она должна реагировать на события.

Добавим методы в класс виджета

protected:
    virtual void mousePressEvent(QMouseEvent*);
    virtual void mouseReleaseEvent(QMouseEvent*);

Добавим реализацию методов

void QLampWidget::mousePressEvent(QMouseEvent *)
{			
     qDebug() << "Mouse pressed";
     repaint();
}
void QLampWidget::mouseReleaseEvent(QMouseEvent *)
{
    qDebug() << "Mouse released";

    if (this->status == QLampWidget::on)
    {
        this->status = QLampWidget::off;
    }
    else
    {
        this->status = QLampWidget::on;
    }

    repaint();
}

Запустим

lampclicked.gif

В консоли мы увидим:

 

Mouse pressed
Mouse released
Mouse pressed
Mouse released
Mouse pressed
Mouse released
Mouse pressed
Mouse released
Mouse pressed
Mouse released

 

Рассмотрим код:

Мы объявляем для метода:

mousePressEvent(QMouseEvent*);
mouseReleaseEvent(QMouseEvent*);

Эти виртуальные методы уже объявлены в родительском классе QWidget и вызываются каждый раз, когда пользователь нажимает или отпускает любую кнопку мыши, в тот момент, когда курсор находится над виджетом.

Обратите внимание, в данный момент, виджет реагирует на нажатие вообще любой кнопки мыши! Давайте это исправим.

 Изменим объявления методов 

mousePressEvent(QMouseEvent*);
mouseReleaseEvent(QMouseEvent*);

на

mousePressEvent(QMouseEvent*event);
mouseReleaseEvent(QMouseEvent* event);

Внесем изменения в сами методы:

void QLampWidget::mousePressEvent(QMouseEvent *event)
{
    switch (event->button()) {
        case Qt::LeftButton:
        {
            qDebug() << "Left Mouse button pressed";
            break;
        }
        case Qt::RightButton:
        {
            qDebug() << "Left Mouse button pressed";
            break;
        }
        case Qt::MiddleButton:
        {
            qDebug() << "Middle Mouse button pressed";
            break;
        }
        default:
        {
            qDebug() << "Other button pressed, id = "+QString::number(event->button());
            break;
        }
    }

    repaint();
}

void QLampWidget::mouseReleaseEvent(QMouseEvent *event)
{
    switch (event->button()) {
        case Qt::LeftButton:
        {
            if (this->status == QLampWidget::on)
            {
                this->status = QLampWidget::off;
            }
            else
            {
                this->status = QLampWidget::on;
            }

            qDebug() << "Left Mouse button released";
            break;
        }
        default:
        {
            qDebug() << "Other button released, id = "+QString::number(event->button());
            break;
        }
    }

    repaint();
}

Запустим и прощелкаем всеми кнопками, в консоли появятся сообщения:

Left Mouse button pressed
Left Mouse button released
Right Mouse button pressed
"Other button released, id = 2"
Middle Mouse button pressed
"Other button released, id = 4"

Теперь смена цвета будет происходить только по щелчку левой кнопкой мыши.

Зашивать в сам виджет функционал смены цвета по щелчку не самая лучшая идея. Но в рамках этой статьи мы остановимся именно на этом способе.

Меняем цвет лапочки с помощью колесика мышки

Добавим обработку движения колесика мыши.

Добавим метод:

protected:
    virtual void wheelEvent(QWheelEvent *event);

 

Реализация: 

void QLampWidget::wheelEvent(QWheelEvent *event)
{
    QPoint numDegrees = event->angleDelta() / 8;
    setActiveColor(numDegrees.y());
}

 

Добавим метод для смены активного цвета:

void QLampWidget::setActiveColor(int count)
{
    this->status = QLampWidget::on;
    QColor mainColorOn = QColor(this->color);


    int lightness = mainColorOn.lightness() + count/5;

    if (lightness < 10) {
        lightness = 10;
    }

    if (lightness > 100) {
        lightness = 100;
    }

    mainColorOn.setHsl(mainColorOn.hslHue(), mainColorOn.hslSaturation(), lightness, mainColorOn.alpha());

    this->color = mainColorOn.name();
    repaint();
}

Запустим:

mousewheel.gif

Рассмотрим код:

Каждый раз когда мы вращаем колесико мы вычисляем количество градусов, на которое повернулось колесико и передаем это значение в метод setActiveColor(int count).

В методе сначала мы принудительно включаем лампочку, так как работаем с цветом включенной лампочки.

Затем создаем экземпляр класса QColor из текущего цвета включенной лампы.

Далее вычисляем новое значение яркости взяв текущее и прибавив к нему count/5

Для того, чтобы значение яркости не вышло за допустимые пределы мы проверяем граничные условия.

На основе вычисленной яркости мы задаем новое значение для цвета включенной лампочки и обязательно перерисовываем виджет.

Двойной щелчок мыши

Добавим метод

protected:
    virtual void mouseDoubleClickEvent(QMouseEvent *event);

Реализация:

void QLampWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
    qDebug() << "Double clicked";
}

 

Обратите внимание, при двойном щелчке одновременно обрабатывается одиночный и двойной щелчок. Для виджета вы можете использовать либо одинарный, либо двойной щелчок!

Заключение

Сегодня мы рассмотрели обработку событий нажатия кнопок мыши на виджет.

Протестировали обработку событий при нажатии и отпускании кнопок мыши.

Проверили событие вращения колесика мыши и двойной щелчок по виджету.

Исходный код проекта вы моежете найти на Github.

Прочитано 1056 раз Последнее изменение Среда, 13 января 2021 12:12