在pyQT中是否有类似qobject_cast的方法?

时间:2013-05-27 06:16:29

标签: casting pyqt

我有一个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

1 个答案:

答案 0 :(得分:2)

PyQt中没有等效的qobject_cast。如果您希望访问重写的超类方法,则必须使用super

在C ++中,当实际指向派生类型的对象时,可以将变量声明为指向一个类型QObject *的指针。例如:

QObject *obj = new QWidget;

我不太清楚C ++是否足以说明方法是在编译时还是在运行时确定的。换句话说,如果你有

obj->someQObjectMethodOverriddenInQWidget(...);

然后我不确定这是否会调用QObjectQWidget方法。 (我猜这将是QObject方法;似乎你想使用qobject_cast将对象强制转换为超类以调用重写的超类方法,如果这没有发生你不想使用qobject_cast。)

另一方面,Python在编译时没有可用的类型信息;它仅依赖于对象的运行时类型来确定要调用的方法。如果您在子类中重写了一个方法,并且想要从超类调用重写方法,则必须使用super。另一方面,如果MyTree未覆盖itemAt,您应该只能调用self.itemAt(...),因为它会从其超类继承itemAt