【问题标题】:crash after QGraphicsProxyWidget is removed from a scene从场景中删除 QGraphicsProxyWidget 后崩溃
【发布时间】:2014-02-09 20:38:42
【问题描述】:

我有一个添加了 QGraphicsProxyWidget 的简单场景(并在其上设置了一些小部件)。

如果我尝试将其从场景中移除,如下所示:

if ( widget )
{
parentScene->removeItem( m_widget ); // m_widget is a QGraphicsProxyWidget
delete m_widget; // I also tried m_widget->deleteLater() here - same result
m_widget = NULL;
}

我立即崩溃 - 没有描述性的调用堆栈,尽管这会告诉我出了什么问题(调用堆栈中的一些与 Windows 相关的调用,仅此而已)。

我正在使用 5.1.1 版的 Qt 库,我在手册和网络上搜索了如何实际删除此类小部件的说明,但根本没有记录,所以我不确定是否我在那里做错了,或者库中有错误。

我将不胜感激。

干杯,

皮奥特

【问题讨论】:

  • 这是一个错字(widget 与 m_widget 在 if 语句中),还是您的实际代码?如果是后者,这可能是你的问题!
  • 是的,抱歉,打错了

标签: qt crash qgraphicsscene


【解决方案1】:

检查您的if 声明:它说widget,而您可能指的是m_widget。如果widget 为非空且m_widget 为空,您的程序将崩溃,因为对removeItem/delete 的调用将尝试引用空指针。

【讨论】:

    【解决方案2】:

    我发现了问题 - 对“prepareGeometryChange”的看似无关的调用应该归咎于此。 我的小部件正在改变大小(我没有提到它,因为当时它似乎无关紧要)。但是,我在对几何图形进行更改之后调用了上述方法,而不是之前,正如手册所指示的那样。

    显然,该方法对于保持场景的内部数据井井有条非常重要,并且由于我调用它不正确,它留下了一些对已删除项目的无效引用。

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      相关资源
      最近更新 更多