删除QGraphicsItem时崩溃

时间:2016-09-22 13:53:55

标签: qt assembly

我想删除QGraphicsScene中的所有项目并删除它们。像这样,

 <service
    android:name="com.example.pranshusrivastav.fcmtest.MyFirebaseMessagingService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service
    android:name="com.example.pranshusrivastav.fcmtest.MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

然而,在运行此代码块并从循环中退出后,它就出现了分段错误。在调试模式下,调试器跳转到汇编文件: enter image description here 出了什么问题?

4 个答案:

答案 0 :(得分:0)

如果您要删除场景中的所有项目,为什么不进行“清除”,如下所示。 你有正确的场景对象。

scene-&GT;清晰();

根据文件: void QGraphicsScene :: clear()

从场景中删除和删除所有项目,但不会保持场景状态不变。

此功能在Qt 4.4中引入。

答案 1 :(得分:0)

代码看起来不错,但我同意只使用QGraphicsScene :: clear更有意义;它确实如此,我的猜测是效率更高。

如果您已派生自己的QGraphicsItem对象,则检查派生类中的析构函数以删除多个内存。您可能会对哪个对象拥有特定指针感到困惑,导致两个不同的项目释放相同的内存。

答案 2 :(得分:0)

你使用指针,当你使用函数clear时,它会调用女儿的析构函数,但是使用指针你必须销毁所有指针。不要使用foreach,尝试使用简单的for循环,因为foreach使用迭代器,我认为删除后迭代器无效。

for(int i=0; i < v.size(); ++i)
{
     delete v[i];
     v[i] = nullptr ;
 }

答案 3 :(得分:0)

迟到的答案,但有人可能会觉得它很有用。

我多次遇到此问题,不仅是在删除项目时,而且在更改项目的位置或尺寸时也是如此。

每次都有效的只是添加

item->prepareGeometryChange();

在执行任何删除/更改尺寸之前。

为什么?不知道。