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 шт):

Автор решения: anrej0705

Пожалуйста, обратите внимание на этот пример. Здесь представлен код класса для 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 и затем левую кнопку мыши

Рис.1 Рис.2

→ Ссылка