如何识别 QGraphicsView 鼠标移动事件?

Posted

技术标签:

【中文标题】如何识别 QGraphicsView 鼠标移动事件?【英文标题】:How can I recognize QGraphicsView mouse move event? 【发布时间】:2018-03-03 18:56:21 【问题描述】:

我是 qt 和 c++ 的新手。我有一个 qgraphicsview 来绘制信号。我会通过鼠标单击和矩形绘图来缩放特定区域。所以我需要鼠标按下位置和拖动位置。为此,我这样做:

在头文件中:

#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();

;

在源文件中:

    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(); 

当我在图形视图中按下并移动鼠标时,我可以识别点击的位置,但mouseMoveEvent(QMouseEvent * ev) 永远不会被调用。还有obj == ui.graphicsView 中的eventFilter 声明永远不会发生。我怎么了?我该如何解决?

【问题讨论】:

【参考方案1】:

通过在QgraphicsView对象的视口上安装事件过滤器如

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

并在eventfilter上添加以下条件

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

问题解决了。

【讨论】:

以上是关于如何识别 QGraphicsView 鼠标移动事件?的主要内容,如果未能解决你的问题,请参考以下文章

求qt在QGraphicsView中主动捕获鼠标位置的实现方法?

阻止 QGraphicsView 的一些鼠标事件

QGraphicsView 中的 MouseMoveEvent

QGraphicsView右键鼠标按下事件问题

重新实现鼠标事件时对 QGraphicsView 的奇怪影响

在自定义 QGraphicsView 中移动 QGraphicsItem 问题