QGraphicsView 中的 MouseMoveEvent

Posted

技术标签:

【中文标题】QGraphicsView 中的 MouseMoveEvent【英文标题】:MouseMoveEvent in QGraphicsView 【发布时间】:2014-02-22 16:53:53 【问题描述】:

我需要在我的主小部件中获取移动事件,但 QGraphicsView 捕获了该事件,因此我无法在我的主小部件中获取它。有什么办法可以关闭它,所以我可以像在我的小部件中捕捉任何 mousemoveevent 一样捕捉事件。注意:问题不在于我禁用了鼠标跟踪。我知道这一点,并且在图形视图之外捕获此事件正在工作

【问题讨论】:

在 QGraphicsView 上安装事件过滤器并拦截移动事件。 【参考方案1】:

在众多解决方案中,有两种可能的解决方案:

忽略

来自文档:

如果你的鼠标事件没有被你处理,你应该调用ignore() 小部件。鼠标事件沿父窗口小部件链向上传播,直到 小部件使用 accept() 接受它,或者事件过滤器使用它。

// view.cpp

mouseMoveEvent(QMouseEvent *event)
event.ignore(); // propagated to parent

双重事件

当发生移动事件时,尝试从 QGraphicsView 发出带有鼠标位置的信号,并在主窗口小部件中捕获它。

// view.cpp

mouseMoveEvent (QMouseEvent *event)
    emit mouseMoveSignal(event.pos());
    


// mainwindow.cpp

mainWindow::mainWindow (QWidget * parent = 0)
    connect(view, SIGNAL(mouseMoveSignal(QPointF)), this, SLOT(mouseMoveSlot(QPointF)));

【讨论】:

事件过滤器似乎是更方便的解决方案。通过信号槽系统传递鼠标事件数据可能太慢,不推荐使用。我不明白你为什么写“双重事件”,因为信号不是事件,不应该与它们混淆。 双重事件:如果您需要在两个小部件中捕获事件。我知道问题不是这样问的;他想忽略这件事。我只是想表达尽可能多的方法。只是好奇,有没有更简单、更明显的方法呢?当然,也可以对子组件应用事件过滤器,并在子组件的移动事件发生时调用父组件的 mouseMoveEvent(我认为这里需要动态转换)。我认为信号更容易处理。

以上是关于QGraphicsView 中的 MouseMoveEvent的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsView::drawBackground 中的故障网格

QGraphicsView 中的 MouseMoveEvent

QT中QGraphicsView中的手指滚动?

如何从 qgraphicsview 中的 qgraphicsitem 获取不同的上下文菜单?

在 QGraphicsView/QGraphicsScene 中移动 QGraphicsProxyWidget 中的嵌入式小部件

如何将 QGraphicsView 提升为 .ui 文件中的自定义小部件?