QGraphicsScene::removeItem() 使用自定义项类后崩溃
Crash after QGraphicsScene::removeItem() with custom item class
我正在使用自定义项目类的实例填充QGraphicsScene
(固有QGraphicsPathItem
(。在运行时的某个时刻,我尝试通过调用以下命令从场景中删除项目(及其子项(:
delete pItem;
这会自动调用QGraphicsScene::removeItem()
,但是它也会导致在下一次重绘时类QGraphicsSceneFindItemBspTreeVisitor
崩溃。
TL;DR:解决方案是确保在将项目从场景中移除之前调用QGraphicsItem::prepareGeometryChange()
。
问题是,在从场景中删除项目期间,场景内部索引未正确更新,导致下次尝试绘制场景时崩溃。
由于在我的情况下,我使用了 QGraphicsPathItem
中的自定义子类,我只是将调用 QGraphicsItem::prepareGeometryChange()
放入其析构函数中,因为我没有手动从场景中删除项目(通过 QGraphicsScene::removeItem()
(,而是我只是调用delete pItem;
,这反过来会触发项目的析构函数以及稍后removeItem()
。
我在使用 PySide2 时遇到了同样的问题。
禁用BSP索引(如此处所述(确实对我有用,并且很可能是该问题的实际解决方案。但这是一个次优的,因为我正在使用的场景可能会变得任意大。我还尝试在删除该项目之前拨打prepareGeometryChange
,虽然这似乎确实有效了一段时间,但几周后错误再次出现。
对我有用的(到目前为止(是在删除项目本身之前手动删除所有子项目......为此,我正在覆盖 Python 中的 QGraphicsScene::removeItem
方法:
class GraphicsScene(QtWidgets.QGraphicsScene):
def removeItem(self, item: QtWidgets.QGraphicsItem) -> None:
for child_item in item.childItems():
super().removeItem(child_item)
super().removeItem(item)
请注意,这在C++中的工作方式并不完全相同,因为QGraphicsScene::removeItem
不是虚拟方法,因此您可能必须添加自己的方法removeItemSafely
或其他方法。
免责声明:其他方法也对我有用...直到他们没有。自从引入此解决方法以来,我没有看到QGraphicsSceneFindItemBspTreeVisitor::visit
崩溃,但这并不意味着这实际上是解决方案。使用风险自负。
我遇到了这个问题,修复它真的很痛苦。除了崩溃,屏幕上还出现了"guost"项目。
我正在自定义 updateGeometry(( 方法中将边界矩形大小更改 2x,该方法更新项目的边界框和形状缓存。
我将边界矩形初始化为 QRectf((:
boundingBox = QRectF();
。然后进行一些处理(并借此机会对场景中不需要的对象进行一些清理(。
最后将 boundingRect 的值设置为其新大小:
boundingBox = polygon.boundingRect();
一开始单独调用 prepareGeometryChange(( 并不能解决问题,因为我要更改它的大小两次。
解决方案是删除第一个属性。
今天这个问题似乎持续了很长时间,并且还有未解决的错误。
但它似乎有一个解决方法,我发现它很有用,经过数小时的调试、阅读和调查,我在这里找到了它:
https://forum.qt.io/topic/71316/qgraphicsscenefinditembsptreevisitor-visit-crashes-due-to-an-obsolete-paintevent-after-qgraphicsscene-removeitem/17
关于图形场景的其他一些提示和技巧在这里:https://tech-artists.org/t/qt-properly-removing-qgraphicitems/3063/6
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 在 C++ 自定义树的某些迭代后崩溃
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 使用自定义上下文菜单删除 QTreeView 项崩溃
- 为什么此自定义指针类会崩溃?
- 自定义numpy类型导致numpy.mean中的崩溃
- C++ - 定义自定义析构函数时程序崩溃
- 尝试编写自定义Allocate_Shared分配器并将其变为thread_local时崩溃
- 自定义分配器有时会与stl向量一起崩溃
- 在自定义控件中创建子按钮窗口后崩溃
- cd库:在推送自定义类型的派生类型时(仅在发布模式下),michael_deque会导致崩溃
- C++自定义模板LinkedList在添加std::string时崩溃
- 带有自定义对象的矢量:当我想使用用.at方法接收的矢量时崩溃
- 另一个类中的自定义类实例数组使编译器崩溃
- Qt5自定义LineEdit小部件(QLineEdit子类)私有变量使应用程序崩溃
- Qt自定义委托崩溃没有错误代码
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃
- QGraphicsScene::removeItem() 使用自定义项类后崩溃
- 自定义复制赋值操作符使程序崩溃(c++)