PySide6自定义信号无法连接:AttributeError问题求助
问题原因与修复方案
核心问题
你的MyRect类仅继承了QGraphicsRectItem,但**QGraphicsRectItem不是QObject的子类**——PySide6的自定义信号(Signal)依赖QObject的元对象系统才能正常工作,这直接导致信号属性无法被正确初始化,从而出现看似奇怪的空属性错误。
修复代码
修改类的继承关系,让MyRect同时继承QObject(必须放在多重继承的第一位)和QGraphicsRectItem,并正确初始化两个父类:
from PySide6.QtCore import Signal, QObject from PySide6.QtWidgets import QGraphicsRectItem class MyRect(QObject, QGraphicsRectItem): before_select = Signal() def __init__(self, thing): QObject.__init__(self) QGraphicsRectItem.__init__(self) self._thing = thing def mousePressEvent(self, event): self.before_select.emit() self._thing["selected"] = True # 调用父类方法保留默认鼠标行为(可选但推荐) super().mousePressEvent(event) def on_before_select(): print("before select") thing = {} rect = MyRect(thing) rect.before_select.connect(on_before_select)
关键说明
QObject继承优先级:Qt的多重继承要求QObject作为第一个父类,这样元对象系统才能正确处理信号槽逻辑。- 父类初始化:分别调用
QObject和QGraphicsRectItem的构造函数,避免初始化冲突。 - 保留默认行为:在重写的
mousePressEvent中调用父类方法,确保QGraphicsRectItem的默认鼠标交互(比如选中状态显示)不受影响。
补充说明
你之前能成功实现信号,是因为当时的类继承了QWidget、QMainWindow这类本身就是QObject子类的组件,而QGraphicsRectItem属于图形项,未继承QObject,所以需要手动添加继承关系。
内容的提问来源于stack exchange,提问作者Code Dog
相关产品推荐
相关产品推荐

