使用悬停事件
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】:
您是否将hoverEnterEvent
和hoverLeaveEvent
标记为虚拟?如果您不这样做,则事件可能正在触发,但 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 的问题以上是关于使用悬停事件的主要内容,如果未能解决你的问题,请参考以下文章