我有一个QTreeWidget的子类,我想做一些操作,比如
class MyTree(QTreeWidget):
def mouseMoveEvent(self, event):
super(MyTreeWidget,self).mouseMoveEvent(event)
event = QMouseEvent(event)
似乎MyTree类型已更改为MyTree,我无法调用QTreeWidget方法itemAt
,除非我使用super
这样的关键字:
super(MyTreeWidget,self).itemAt(event.globalPos())
PyQt中有qobject_cast
的类似方法吗?我知道Qt中存在qobject_cast
。
答案 0 :(得分:2)
PyQt中没有等效的qobject_cast
。如果您希望访问重写的超类方法,则必须使用super
。
在C ++中,当实际指向派生类型的对象时,可以将变量声明为指向一个类型QObject *
的指针。例如:
QObject *obj = new QWidget;
我不太清楚C ++是否足以说明方法是在编译时还是在运行时确定的。换句话说,如果你有
obj->someQObjectMethodOverriddenInQWidget(...);
然后我不确定这是否会调用QObject
或QWidget
方法。 (我猜这将是QObject
方法;似乎你想使用qobject_cast
将对象强制转换为超类以调用重写的超类方法,如果这没有发生你不想使用qobject_cast
。)
另一方面,Python在编译时没有可用的类型信息;它仅依赖于对象的运行时类型来确定要调用的方法。如果您在子类中重写了一个方法,并且想要从超类调用重写方法,则必须使用super
。另一方面,如果MyTree
未覆盖itemAt
,您应该只能调用self.itemAt(...)
,因为它会从其超类继承itemAt
。