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

Posted

技术标签:

【中文标题】在 Qt c++ 中处理鼠标事件【英文标题】:Handling MouseEvents in Qt c++ 【发布时间】:2010-08-10 13:12:57 【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

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

    使用线程和链接中描述的事件过滤器。

【讨论】:

Marcin,在你的情况下,最好的方法是第二点(使用事件过滤器)【参考方案2】:

因为鼠标事件是受保护的虚函数,所以最简单的方法就是您正在做的事情。我看不出定义子类会导致问题的任何原因,所以我说坚持你所拥有的。

如果你真的想用槽连接事件,你可以让你的子类实现mousePressEvent(),例如,简单的emit mousePressSignal()。当然,您还需要在子类标头的signals 部分声明mousePressSignal()

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

根据您的问题,

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

答案是你不能

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

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

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

你现在做的就是要做的。

【讨论】:

错了,可以安装事件过滤器,或者对于QGRaphicsView,也可以安装场景事件过滤器。 @ Frank,是的,可以安装事件过滤器,但您不能将事件连接到插槽。在事件处理程序中,您可以发出信号,但即使这样,也只能将信号与插槽连接,而不是一个事件..【参考方案5】:

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

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

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

【讨论】:

以上是关于在 Qt c++ 中处理鼠标事件的主要内容,如果未能解决你的问题,请参考以下文章

QT学习之事件处理

Qt中的鼠标事件

Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和。先处理自己队列中的消息,然后再处理系统消息队列中的消息)

c++ builder 鼠标移开窗体时的事件

PyQt5-Qt Designer鼠标+键盘事件

QT 中QComboBox控件鼠标事件过滤