Search code examples
c++qtqgraphicsviewqmouseevent

How can I recognize QGraphicsView mouse move event?


I am new in qt and c++. I have a qgraphicsview to plot signal. I would zoom specific area with mouse clicking and rectangle drawing. So I need mouse pressed position and dragged position. For this I do such this:

in header file:

#include <QtWidgets/QMainWindow>
#include <QGraphicsScene>
#include <QMouseEvent>
#include <QGraphicsSceneMouseEvent>
#include "ui_QtGuiApplication.h"

class QtGuiApplication : public QMainWindow
{
Q_OBJECT

public:
QtGuiApplication(QWidget *parent = Q_NULLPTR);

protected:
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
bool eventFilter(QObject *obj, QEvent *ev);

private:
Ui::QtGuiApplicationClass ui;
QPoint Zoom_point1_;
QPoint Zoom_point2_;
QGraphicsScene* scene = new QGraphicsScene();

};

in source file:

    QtGuiApplication::QtGuiApplication(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    ui.graphicsView->installEventFilter(this);
    ui.graphicsView->setMouseTracking(true);
}

bool QtGuiApplication::eventFilter(QObject * obj, QEvent * ev)
{
    if (obj == ui.graphicsView)
        if (ev->type() == QEvent::MouseMove)
        {
            QMouseEvent *mEvent = (QMouseEvent*)ev;
            Zoom_point2_ = mEvent->pos();
        }
    return false;
}
void QtGuiApplication::mouseMoveEvent(QMouseEvent * ev)
{
    Zoom_point2_ = ev->globalPos();
    //do some thing …
}

void QtGuiApplication::mousePressEvent(QMouseEvent * ev)
{
    Zoom_point1_ = ev->globalPos(); 
}

When I press and move mouse in graphicsview, I can recognize the clicked position but mouseMoveEvent(QMouseEvent * ev) never be called. and also obj == ui.graphicsView statement in eventFilter never be occurred.What's wrong with me? How can I fix it?


Solution

  • By Installing event filter on the viewport of the QgraphicsView object such as

    ui.graphicsView->viewport()->installEventFilter(this);
    

    and adding below condition on eventfilter

    if (ui.graphicsView->viewport())
            if (ev->type() == QEvent::MouseMove)
            {
                QMouseEvent *mEvent = (QMouseEvent*)ev;
                Zoom_point2_ = mEvent->pos();
            }
    

    problem solved.