Обработка нажатий кнопок мыши - Виджеты в Qt. Часть 3
Сегодня мы добавим для виджета обработку нажатий кнопок мыши. Виджет будет реагировать на одиночный щелчок левой, правой и центральной кнопки и на движение колесика мыши. Так же мы проверим двойной щелчок мыши.
Добавление реакции на щелчок
В этой статье мы будем использовать проект из предыдущей статьи.
Допустим, нам нужно, чтобы по щелчку лампа меняла цвет, для этого она должна реагировать на события.
Добавим методы в класс виджета
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();
}
Запустим
В консоли мы увидим:
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();
}
Запустим:
Рассмотрим код:
Каждый раз когда мы вращаем колесико мы вычисляем количество градусов, на которое повернулось колесико и передаем это значение в метод setActiveColor(int count).
В методе сначала мы принудительно включаем лампочку, так как работаем с цветом включенной лампочки.
Затем создаем экземпляр класса QColor из текущего цвета включенной лампы.
Далее вычисляем новое значение яркости взяв текущее и прибавив к нему count/5
Для того, чтобы значение яркости не вышло за допустимые пределы мы проверяем граничные условия.
На основе вычисленной яркости мы задаем новое значение для цвета включенной лампочки и обязательно перерисовываем виджет.
Двойной щелчок мыши
Добавим метод
protected:
virtual void mouseDoubleClickEvent(QMouseEvent *event);
Реализация:
void QLampWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
qDebug() << "Double clicked";
}
Обратите внимание, при двойном щелчке одновременно обрабатывается одиночный и двойной щелчок. Для виджета вы можете использовать либо одинарный, либо двойной щелчок!
Заключение
Сегодня мы рассмотрели обработку событий нажатия кнопок мыши на виджет.
Протестировали обработку событий при нажатии и отпускании кнопок мыши.
Проверили событие вращения колесика мыши и двойной щелчок по виджету.
Исходный код проекта вы моежете найти на GitFlic.
Добавить комментарий