使用悬停事件

Posted

技术标签:

【中文标题】使用悬停事件【英文标题】:Using Hover Events 【发布时间】:2012-09-14 15:57:40 【问题描述】:

我无法在 QGraphicsRectItem 中捕获悬停进入和悬停离开事件。

我已经对这个对象进行了子类化,并重新实现了悬停进入和悬停离开处理程序......或者至少我认为我有。我还在构造函数中将接受悬停事件设置为 true。

但是,该事件永远不会被触发。处理程序中的断点永远不会被命中。

这是课程:

#include "qhgraphicsrectitem.h"

QhGraphicsRectItem::QhGraphicsRectItem(QGraphicsRectItem *parent) :
    QGraphicsRectItem(parent)

    setAcceptHoverEvents(true);
    setAcceptsHoverEvents(true);


void QhGraphicsRectItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) 
    oldBrush = brush();
    setBrush(QBrush(QColor((oldBrush.color().red() + (0.5 * (255-oldBrush.color().red()))),(oldBrush.color().green() + (0.5 * (255-oldBrush.color().green()))),(oldBrush.color().blue() + (0.5 * (255-oldBrush.color().blue()))))));


void QhGraphicsRectItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) 
    setBrush(oldBrush);

我做错了什么?

【问题讨论】:

发布的代码看起来不错,除了“setAcceptsHoverEvents”不是QGraphicsItem的方法。也许那是你做过的其他事情。无论如何,您可能必须在setBrush 之后调用update()。你在搞乱矩形吗? @Anthony 我没有改变矩形,不。我也没有用我的 QGraphicsView 或 QGraphicsScene 处理这些事件......我尝试更新,没有任何反应。 "setAcceptsHoverEvent" 曾经在课堂上,他们把它拿出来已经贬值了,如果你检查他们的来源你会看到。项目不会获得悬停事件,因为默认情况下当鼠标启动时不会发生 mousemove 事件。要获得这些,覆盖或使用 QGraphicsView::setMouseTracking(true) 来获取鼠标移动事件,无需按下按钮...我个人不得不将代码从 setAcceptsHoverEvents 更新为 setAcceptHoverEvents,似乎改变是一件愚蠢的事情,但我想这并不是完全明确的,所以.. 类似问题:***.com/questions/2940392/…. 【参考方案1】:

您是否将hoverEnterEventhoverLeaveEvent 标记为虚拟?如果您不这样做,则事件可能正在触发,但 QGraphicsItem 正在处理该事件。

class QhGraphicsRectItem : public QGraphicsItem

    ...
    virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
    virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

【讨论】:

我将它们定义为受保护的虚拟虚空。 这是不必要的。对于 C++11 的正确建议是将它们标记为 override,或者,如果您更喜欢 Qt 宏并且正在使用 Qt 5,则标记为 Q_DECL_OVERRIDE(当然,这些对 C++98 编译器没有任何作用)。【参考方案2】:

您的项目是否位于QGraphicsItemGroup 下?

在找到这句话之前,我遇到了完全相同的问题:

QGraphicsItemGroup 是一种特殊类型的复合项,它将自身及其所有子项视为一个项(即,所有子项的所有事件和几何图形都合并在一起)。”

(看这里:http://qt-project.org/doc/qt-4.8/qgraphicsitemgroup.html

这意味着QGraphicsItemGroup 调用setHandlesChildEvents(true)

我通过在位于我的项目上方的任何(和所有)组上调用 parentItem->setHandlesChildEvents(false) 以捕获悬停事件来解决我的问题。噗!这些事件开始出现在您提到的虚拟回调中。

【讨论】:

我遇到了另一个问题,但是它不能解决我的问题,类似于 OP 的问题

以上是关于使用悬停事件的主要内容,如果未能解决你的问题,请参考以下文章

VueJS父鼠标悬停事件屏蔽子鼠标悬停事件

vue的鼠标点击事件和悬停事件

使用动态鼠标悬停事件抓取网站

使用悬停事件或鼠标悬停扩展 sap.ui.core.Icon

如何使用键盘事件模拟悬停

使用 CSS3 触摸事件的悬停效果