2010-08-10 33 views
4

对不起,我的初学者的问题... 什么是最简单的方法来定义过程,当MousePressEvent或MouseReleaseEvent发生时执行?在Qt中处理MouseEvents C++

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

感谢您的帮助。

回答

4

This thread在Qt中心论坛上很好地描述了你的选择。简单地说:

  1. 你在做什么(即子类化和重新实现)

  2. 与事件过滤器工作作为其中的线程和链接描述。

+0

Marcin,在你的情况下,最好的方法是第二点(使用事件过滤器) – 2010-08-11 08:02:55

2

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

如果您确实想要将事件与插槽相连接,则可以使您的子类实现mousePressEvent(),例如,简单emit mousePressSignal()。当然,您还需要在子类头的signals部分声明mousePressSignal()

2

我可以看到重写QGraphicsView::mousePressEventQGraphisView::mouseReleaseEvent没有问题。整个事件处理概念是围绕虚拟事件处理函数构建的。

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

0

从你的问题,

有没有什么办法来 解决这个问题,而不必 定义一个新类?

答案是你不能

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

我可以以某种方式将事件与插槽 连接起来吗?

您不能将事件连接到插槽,但只能将信号连接到插槽。

你现在正在做的方式是要做的。

+0

错误的,可以安装事件过滤器,或者,对于QGRaphicsView,也可以安装场景事件过滤器。 – 2010-08-10 14:58:27

+0

@ Frank,是的,你可以安装事件过滤器,但你不能将事件连接到插槽。在事件处理程序中,你可以发出信号,但即使只有一个信号可以连接到插槽而不是事件.. – liaK 2010-08-11 04:58:23

0

您可以使用事件过滤器:见http://doc.qt.nokia.com/4.6/qobject.html#eventFilter 或者,在特定的图形项目,http://doc.qt.nokia.com/4.6/qgraphicsitem.html#sceneEventFilter

注意,对于后者,一些事件改变:QMouseEvent成为QGraphicsSceneMouseEvent例如,所以一定要筛选权类型。

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