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 吗?的主要内容,如果未能解决你的问题,请参考以下文章