对不起我的初学者的问题......定义程序的最简单方法是什么,当 MousePressEvent 或 MouseReleaseEvent 发生时执行?
现在我正在定义我自己的类(MyGraphicsView 类),它继承 QGraphicsView 并且我正在重新实现鼠标事件(它们是虚函数)。它工作得很好,但是有没有什么方法可以解决这个问题而不需要定义一个新的类?我可以以某种方式将事件与插槽连接起来吗?
谢谢你的帮助。
对不起我的初学者的问题......定义程序的最简单方法是什么,当 MousePressEvent 或 MouseReleaseEvent 发生时执行?
现在我正在定义我自己的类(MyGraphicsView 类),它继承 QGraphicsView 并且我正在重新实现鼠标事件(它们是虚函数)。它工作得很好,但是有没有什么方法可以解决这个问题而不需要定义一个新的类?我可以以某种方式将事件与插槽连接起来吗?
谢谢你的帮助。
Qt Center 论坛上的这个帖子很好地描述了您的选择。简单的说:
做你正在做的事情(即子类化和重新实现)
使用线程中描述的事件过滤器并在其中链接。
因为鼠标事件是受保护的虚函数,所以最简单的方法就是您正在做的事情。我看不出定义子类会导致问题的任何原因,所以我说坚持你所拥有的。
如果你真的想用插槽连接事件,你可以让你的子类实现mousePressEvent()
,例如,简单的emit mousePressSignal()
。当然,您还需要在子类头mousePressSignal()
的signals
部分中声明。
我看不出覆盖QGraphicsView::mousePressEvent
and没有问题QGraphisView::mouseReleaseEvent
。QGraphicsView
//整个事件处理概念是围绕虚拟事件处理函数构建的QGraphicsScene
。QGraphicsItem
此外,Qt 文档还建议“您可以通过创建 的子类QGraphicsView
并重新实现鼠标和键事件处理程序来提供自己的自定义场景交互。”
从你的问题来看,
有什么方法可以解决这个问题而不必定义一个新类?
答案是否定的。你不能。
您必须从要处理事件的类继承。
我可以以某种方式将事件与插槽连接起来吗?
没有。您不能将事件连接到插槽,但只能将信号连接到插槽。
你现在做的方式就是要做的方式。
您可以使用事件过滤器:请参阅http://doc.qt.nokia.com/4.6/qobject.html#eventFilter 或者,对于图形项目,特别是http://doc.qt.nokia.com/4.6/qgraphicsitem。 html#sceneEventFilter
请注意,对于后者,一些事件会发生变化:例如,QMouseEvent 变为 QGraphicsSceneMouseEvent,因此请确保过滤正确的类型。
哪个更容易,取决于情况。如果你有一个子类,重新实现虚拟方法通常比事件过滤器方法更直接。但是,如果您想跟踪来自几个不同类的多个小部件并且需要对某个事件进行特殊处理,那么仅为此目的进行子类化是乏味的并且不是一个好的设计(并且例如使这些小部件的设计器更难使用)。