将事件传递/转发到Qt中的子对象

时间:2010-01-28 23:33:21

标签: qt events

我正在研究Qt应用程序,我遇到了将鼠标事件发送到我需要的问题。

这是我所拥有的高级视图(每个级别还有其他事情需要视图和场景):

+----------------
| App Window       -- QMainWindow
| +--------------
| | View           -- QGraphicsView   --- Grabbing mouse events here for Mode 1
| | +------------
| | | Scene        -- QGraphicsScene
| | | +----------
| | | | Image      -- QGraphicsPixmap --- Want to grab mouse events here for Mode 2
| | | | 

在模式1中,我在 View 级别抓取 mousePressEvent 事件。在模式2中,我想在 Image 级别抓取鼠标事件。在我在View类中重载 mousePressEvent 之前,我能够获取 Image 中的所有事件。现在我正在 View 捕获我无法在Image中获取鼠标事件。 图像 Scene 中是私有的,我不想公开它。

这里没有继承权;每个项目都是由其上方的对象创建的对象。

通过这个问题Qt -- pass events to multiple objects?阅读,似乎我想在 Image 级别捕获鼠标事件并让它们重新启动;但是,我仍然需要在 View 中创建 mousePressEvent ,我会回到原来的位置。

有没有办法在运行时打开/关闭事件处理并确保它们到达较低级别?或者有没有办法将事件转发给子对象?

1 个答案:

答案 0 :(得分:5)

有没有办法在运行时打开/关闭事件处理并确保它们到达较低级别?或者有没有办法将事件转发给子对象?

有一些可能性:

  1. 使用 QGraphicsScene :: sendEvent (...)将事件发送到项目。由于方法场景()可以从任何项目访问scene()。也许这是一个适合你的解决方案。
  2. 您可以使用静态方法 QCoreApplication :: sendEvent (...)执行相同的工作。
  3. 事件过滤器可以完成此任务,请参阅事件和事件过滤器一章
  4. 您可以使用Graphicsview框架的特定安装事件系统( QGraphicsItem :: sceneEventFilter (...)和 installSceneEventFilter (...)
  5. 在运行时,可以使用方法QGraphicsItem :: setAcceptedMouseButtons (...)关闭/打开鼠标事件。

    还有许多其他可能性......

    希望它有所帮助!