QMouseEvent и mouseMoveEvent
как при помощи QMouseEvent узнать какая кнопка мыши была нажата?
Мой код:
void Widget::mouseMoveEvent(QMouseEvent *event) {
qDebug() << event -> button();
if (event -> button() == Qt::LeftButton) {
qDebug() << "left";
}
if (event -> button() == Qt::NoButton) {
qDebug() << "no";
}
}
Когда я двигаю мышью без нажатия кнопки, ничего не выводит, когда двигаю мышь с зажатием любой кнопки на мыши, в консоль выводится:
Qt::NoButton
no
Ответы (1 шт):
Пожалуйста, обратите внимание на этот пример. Здесь представлен код класса для Qt 5.14.2, который после нажатия кнопки в пределах окна в реалтайме пишет какая кнопка была нажата, координаты локальные(в пределах окна) и глобальные - в пределах монитора и клавиши-модификаторы, которые были нажаты - например Ctrl+RMB(правая кнопка мыши)
MouseObserver.h
#include <QtWidgets>
class MouseObserver : public QLabel
{
protected:
virtual void mousePressEvent(QMouseEvent* pe);
virtual void mouseReleaseEvent(QMouseEvent* pe);
virtual void mouseMoveEvent(QMouseEvent* pe);
void dumpEvent(QMouseEvent* pe, const QString& strMessage);
QString modifiedInfo(QMouseEvent* pe);
QString buttonsInfo(QMouseEvent* pe);
public:
MouseObserver(QWidget* mWgt = 0);
};
MouseObserver.cpp
#include "MouseObserver.h"
//Конструктор класса по умолчанию. Создается виджет QLabel, устанавливается центровка и выводится надпись режима ожидания
MouseObserver::MouseObserver(QWidget* mWgt) : QLabel(mWgt)
{
setAlignment(Qt::AlignCenter);
setText("Mouse interaction\n(Press a mouse button)");
}
//Метод перехваютывающий событие нажатие кнопки мыши
void MouseObserver::mousePressEvent(QMouseEvent* pe)
{ //Здесь и далее - в методах можно писать любой код, который вам заблагорассудится
//здесь минимальный код просто показывающий что метод перехватил событие и отправил смску
dumpEvent(pe, "Mouse pressed");
}
//Метод перехвата отпуска кнопки мыши
void MouseObserver::mouseReleaseEvent(QMouseEvent* pe)
{
dumpEvent(pe, "Mouse released");
}
//Метод срабатывающий на событие перемещения мыши
void MouseObserver::mouseMoveEvent(QMouseEvent* pe)
{
dumpEvent(pe, "Mouse is moving");
}
//Метод отображающий информацию о мыши срабатывающий на каждое событие мыши
void MouseObserver::dumpEvent(QMouseEvent* pe, const QString& strMsg)
{
setText(strMsg +
"\n buttons()=" + buttonsInfo(pe) +
"\n x()=" + QString::number(pe->x()) +
"\n y()=" + QString::number(pe->y()) +
"\n globalX()=" + QString::number(pe->globalX()) +
"\n globalY()=" + QString::number(pe->globalY()) +
"\n modifiers()=" + modifiedInfo(pe));
}
//Метод, выводящий информацию о нажатиях кнопок клавиатуры
QString MouseObserver::modifiedInfo(QMouseEvent* pe)
{
QString strModifiers;
if (pe->modifiers()&Qt::ShiftModifier)
strModifiers += "Shift ";
if (pe->modifiers()&Qt::ControlModifier)
strModifiers += "Ctrl ";
if (pe->modifiers()&Qt::AltModifier)
strModifiers += "Alt ";
return strModifiers;
}
//Метод, выводящий информацию о нажатиях кнопок мыши
QString MouseObserver::buttonsInfo(QMouseEvent* pe)
{
QString strButtons;
if (pe->buttons()&Qt::LeftButton)
strButtons += "Left ";
if (pe->buttons()&Qt::RightButton)
strButtons += "Right ";
if (pe->buttons()&Qt::MidButton)
strButtons += "Middle";
return strButtons;
}
main.cpp
#include <QtWidgets/QApplication>
#include "MouseObserver.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MouseObserver mWgt;
mWgt.resize(250, 130);
mWgt.show();
//Qt48 w;
//w.show();
return a.exec();
}
Пример работы кода, скомпилированного в MSVC2019. На рис.1 я просто навёл курсор мыши на окно, но ничего не нажимал. На рис.2 я нажал клавишу Ctrl и затем левую кнопку мыши

