QGraphicsScene Event::widget() 总是 QGraphicsView 吗?

Posted

技术标签:

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

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

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

我问的原因是,在我的子类 QGraphicsScene 中,我已经覆盖了 QGraphicsScene::mousePressEvent() 并且我想知道哪个视图引发了事件——我想知道将 widget() 静态转换为 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.
    // ..

【讨论】:

您的回答让我找到了正确的答案。谢谢。

以上是关于QGraphicsScene Event::widget() 总是 QGraphicsView 吗?的主要内容,如果未能解决你的问题,请参考以下文章

调整 QGraphicsScene 大小时的事件

接受拖放到 QGraphicsScene

查看整个 QGraphicsScene

qt - 在 QGraphicsScene 中如何捕捉特定项目

向QGraphicsScene中加入控件

平滑更新 QGraphicsscene