0

我有一个 QTreeWidget 的子类,我想做一些操作,比如

class MyTree(QTreeWidget):
    def mouseMoveEvent(self, event):
        super(MyTreeWidget,self).mouseMoveEvent(event)
        event = QMouseEvent(event)

似乎 MyTree 类型已更改为 MyTree,itemAt除非我使用super如下关键字,否则我无法调用 QTreeWidget 方法:

super(MyTreeWidget,self).itemAt(event.globalPos())

qobject_castPyQt中是否有类似的方法?我知道qobject_cast存在于 Qt 中。

4

1 回答 1

2

PyQt中没有等价物qobject_cast。如果你想访问一个被覆盖的超类方法,你必须使用super.

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

QObject *obj = new QWidget;

我不太了解 C++,无法说明方法是在编译时还是在运行时确定的。换句话说,如果你有

obj->someQObjectMethodOverriddenInQWidget(...);

那么我不确定这是否会调用QObjectorQWidget方法。(我猜这将是QObject方法;似乎您想使用qobject_cast将对象强制转换为超类以调用覆盖的超类方法,如果没有发生这种情况,您就不想使用qobject_cast.)

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

于 2013-05-27T08:39:56.127 回答