在Qt c ++中处理鼠标事件

时间:2010-08-10 13:12:58

标签: c++ qt qt4 qgraphicsview

对不起我的初学者的问题...... 定义过程的最简单方法是什么,当MousePressEvent或MouseReleaseEvent发生时执行?

现在我正在定义自己的类(MyGraphicsView类),它继承了QGraphicsView,我正在重新实现鼠标事件(这是虚函数)。它工作正常,但有没有办法解决这个问题,而无需定义新的类? 我能以某种方式将事件与插槽连接吗?

感谢您的帮助。

5 个答案:

答案 0 :(得分:4)

Qt中心论坛上的

This thread很好地描述了您的选择。简单地说:

  1. 做你正在做的事情(即子类化和重新实现)

  2. 使用事件过滤器,如线程和链接中所述。

答案 1 :(得分:2)

因为鼠标事件是受保护的虚拟函数,所以最简单的方法就是你正在做的事情。我没有看到为什么定义一个子类会导致问题的原因,所以我说坚持你拥有的东西。

如果您确实想要将事件与插槽相关联,则可以将子类实现为mousePressEvent(),例如,emit mousePressSignal()。当然,您还需要在子类标题的mousePressSignal()部分声明signals

答案 2 :(得分:2)

我可以看到覆盖QGraphicsView::mousePressEventQGraphisView::mouseReleaseEvent没问题。整个QGraphicsView / QGraphicsScene / QGraphicsItem事件处理概念是围绕虚拟事件处理函数构建的。

此外,Qt documentation还表示“您可以通过创建QGraphicsView的子类并重新实现鼠标和键事件处理程序来提供自己的自定义场景交互。”

答案 3 :(得分:0)

从你的问题,

  

有没有办法   无需解决这个问题   定义一个新类?

答案是你不能

您必须从要处理事件的类继承。

  

我可以将事件与插槽连接   不知何故?

即可。 您无法将事件连接到插槽,但只能将信号连接到插槽。

您现在的方式是做的方法。

答案 4 :(得分:0)

您可以使用事件过滤器:请参阅http://doc.qt.nokia.com/4.6/qobject.html#eventFilter 或者,特别是图形项目http://doc.qt.nokia.com/4.6/qgraphicsitem.html#sceneEventFilter

请注意,对于后者,某些事件会发生变化:例如,QMouseEvent变为QGraphicsSceneMouseEvent,因此请确保过滤掉正确的类型。

更容易,取决于具体情况。如果您还有子类,重新实现虚方法通常比事件过滤方法更直接。但是如果你想跟踪来自几个不同类的几个小部件并且需要对某个事件进行特殊处理,那么仅仅为此目的的子类化是单调乏味的并且不是一个好的设计(并且例如使用设计器来更好地使用这些小部件)。