QGraphicsEllipseItem如何捕捉事件

Posted

技术标签:

【中文标题】QGraphicsEllipseItem如何捕捉事件【英文标题】:QGraphicsEllipseItem how to catch events 【发布时间】:2014-07-28 09:25:26 【问题描述】:

我正在开发 MAC OS X / Qt 5.3 小部件应用程序,但遇到了问题。我有QGraphicsView 包含带有可移动QGraphicsEllipseItem 的场景,但我不知道如何捕捉移动事件的结束。

我想要做的是每次点的拖动事件结束时触发一个方法(如果这不可能,那么当它移动时),但我不知道从哪里开始或做什么。我不想自己实现QGraphicsEllipseItem,但如果这是唯一的选择,我可能需要帮助。

问题也是我不知道在哪里听这些事件,我有一个类可以将点插入到小部件中,通常用作它的代码隐藏,我想在那里进行捕捉因为该方法可以从那里访问并从中获取特定数据。我完全不知道该做什么或怎么做。我不想要完整的代码,但如果可以的话,我会很感激一个例子(指定位置)。

【问题讨论】:

你不能使用QGraphicsView::dropEvent吗?也许您将它与 QGraphicsView::itemAt 结合使用事件的坐标,以确保您正在与正确的对象进行交互 原始拖动总是以鼠标按下 + 鼠标移动开始,并以鼠标释放结束。 非常感谢您的建议。我只是不知道在哪里听这些事件或如何听。我将编辑问题。 【参考方案1】:

正如@SebastianLange 所说,您需要处理鼠标事件。基于相同的方法,有两种方法可以做到这一点。

QGraphicsItem支持以下功能:

virtual void    mouseMoveEvent ( QGraphicsSceneMouseEvent * event )
virtual void    mousePressEvent ( QGraphicsSceneMouseEvent * event )
virtual void    mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )

第一种方法是从QGraphicsEllipseItem 继承并覆盖mouseEvents,这样您就可以知道项目何时被移动,并且mouseReleaseEvent 中的调用表示移动已经结束。

如果你不想从QGraphicsEllipseItem继承,另一种方法是install a scene event filter

这涉及创建一个从QGraphicsItem 派生的单独对象,重载鼠标事件(如上),然后将该对象安装为QGraphicsEllipseItem 对象的事件过滤器。

就个人而言,我建议使用第一种方法并继承自QGraphicsEllipseItem

【讨论】:

以上是关于QGraphicsEllipseItem如何捕捉事件的主要内容,如果未能解决你的问题,请参考以下文章

NativeScript:如果用户点击 RadListView 中的空白空间,我如何捕捉点击事件?

QGraphicsItem 移动事件 - 获取绝对位置

当用户向上滚动时,如何使我的 tableHeaderView 捕捉并取消捕捉到隐藏/未隐藏位置

如何防止 UISlider 在捕捉/步进时跳到位

如何捕捉空指针异常? [复制]

如何捕捉异常