PyQt5中QObject与QGraphicsItem多继承调用setFlags()崩溃问题
问题原因
- 这是PyQt5的SIP绑定机制对自定义多重Qt类继承的处理限制导致的。
QGraphicsItem本身不是QObject的子类,你手动同时继承QObject和QGraphicsItem时,PyQt5的元对象系统无法正确计算两个父类的内存布局偏移,调用QGraphicsItem的成员方法时会出现指针访问错误,触发段错误直接崩溃,不会抛出Python层的异常。 - PySide2使用的Shiboken绑定生成器对这类多重继承场景的兼容性更好,能正确处理不同父类的指针偏移,所以相同代码可以正常运行。
- 你没有操作遗漏,这是PyQt5本身的绑定特性决定的。
修复方案
Qt本身已经提供了专门的类QGraphicsObject,这个类原生同时继承了QObject和QGraphicsItem,完全适配PyQt5的元对象机制,直接用这个类作为父类即可,不需要手动多继承。
修改你的Item类定义部分:
# 首先导入QGraphicsObject from PyQt5.QtWidgets import QGraphicsObject # 修改继承关系 class Item(QGraphicsObject): def __init__(self): super().__init__() self.setFlags(QGraphicsItem.ItemIsSelectable | QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemSendsScenePositionChanges) # 剩余的boundingRect、paint方法不需要做任何修改
修改后代码即可正常运行,功能和你原来的实现完全一致。
内容的提问来源于stack exchange,提问作者nutrx
相关产品推荐
相关产品推荐

