【问题标题】:Is a QGraphicsSceneEvent::widget() always a QGraphicsView?QGraphicsScene Event::widget() 总是 QGraphicsView 吗?
【发布时间】:2014-03-28 19:06:00
【问题描述】:

根据the docsQGraphicsSceneEvent::widget()返回一个QWidget。不过,小部件总是会不会是 QGraphicsView(或 null)?

我会假设是这样,但我不明白为什么开发人员不会直接做到QGraphicsSceneEvent::view()

我问的原因是,在我的子类 QGraphicsScene 中,我已经覆盖了 QGraphicsScene::mousePressEvent() 并且我想知道哪个视图引发了事件——我想知道将 widget() 静态转换为 QGraphicsView 是否安全,或者可以想象其他一些小部件可能已经创建了该事件。

【问题讨论】:

    标签: qt qgraphicsview


    【解决方案1】:

    事实证明,QGraphicsSceneEvent::widget() 返回的是视口小部件,而不是 QGraphicsView。如果你想要 QGraphicsView,你需要使用:event->widget()->parent()

    【讨论】:

      【解决方案2】:

      您引用的文档页面提到 QGraphicsView 作为事件的目标:

      当一个 QGraphicsView 接收到 Qt 鼠标、键盘和拖放时 事件(QMouseEvent、QKeyEvent、QDragEvent 等),它会翻译它们 进入 QGraphicsSceneEvent 子类的实例并将它们转发到 它显示的 QGraphicsScene。然后场景将事件转发到 相关项目。

      但是,如果您怀疑 QGraphicsSceneEvent::widget() 总是返回 QGraphicsView,或者您转发它应该始终是 QGraphicsView,您可以使用 qobject_cast 进行检查:

      QGraphicsView *view = qobject_cast<QGraphicsView *>(event->widget();
      if (view) {
          // Handle the event
      } else {
          // This is something that I do not expect.
          // ..
      }
      

      【讨论】:

      • 您的回答让我找到了正确的答案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2017-02-16
      • 2011-06-26
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2013-10-26
      • 2012-10-03
      相关资源
      最近更新 更多