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

dwj*_*dwj 4 events qt

我正在研究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
| | | | 
Run Code Online (Sandbox Code Playgroud)

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

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

阅读这个问题Qt - 将事件传递给多个对象?让我觉得我想在图像级别捕获鼠标事件并让它们重新启动; 但是,我仍然需要在View中创建mousePressEvent,我会回到原来的位置.

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

Mat*_*ieu 5

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

有一些可能性:

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

在运行时,可以使用方法QGraphicsItem :: setAcceptedMouseButtons(...)关闭/打开鼠标事件.

还有很多其他的可能性......

希望能帮助到你 !