PySide2.QtCore.QAbstractItemModel.parent()的方法模板错误:问题出在哪里?

问题描述 投票:0回答:1

我正在尝试使用PySide2实现QAbstractItemModel的子类。

父方法的签名是

virtual QModelIndex parent(const QModelIndex &index) const = 0

PyCharm(社区2019.3.4以及2019.2.5,以及专业版2019.3)期望此签名:

import PySide2
from PySide2.QtCore import QAbstractItemModel

class MyModel(QAbstractItemModel):
    def parent(self) -> PySide2.QtCore.QObject:
        return super().parent()

在此模板中,parent()没有参数,这似乎没有任何意义。

当我切换到PyQt5时,自动生成的方法模板符合预期:

from PyQt5.QtCore import QAbstractItemModel

class MyModel(QAbstractItemModel):

    def parent(self, QModelIndex=None):
        return super().parent(QModelIndex)

PySide2 documentation再次显示正确的模式:

PySide2.QtCore.QAbstractItemModel.parent(child)

Parameters

    child – QModelIndex
Return type

    QModelIndex

我尝试了PySide 5.14.1和5.13.2。

这里发生了什么?是PySide2或PyCharm中的错误吗?

pycharm pyside2
1个回答
0
投票

恕我直言,在两种情况下(PyQt5和PySide2),PyCharm linter都有一个错误。

QAbstractItemModel是一个QObject,因此它具有相同的QObject方法,并且QObject具有parent()方法(这是QObject之间的层次结构的一部分:]

QObject *QObject::parent() const

返回指向父对象的指针。

也QAbstractItemModel处理QModelIndex之间的层次结构,因此它需要一个parent(const QModelIndex&)方法,该方法提供另一个QModelIndex的QModelIndex父级:

QObject *QObject::parent() const

返回具有给定索引的模型项的父项。如果项目没有父项,将返回无效的QModelIndex。

在公开树数据结构的模型中使用的通用约定是仅第一列中的项目具有子级。在这种情况下在子类中重新实现此函数的返回列QModelIndex将为0。

在子类中重新实现此函数时,请小心避免调用QModelIndex成员函数,例如QModelIndex :: parent(),因为属于您模型的索引会简单地调用您的实现,导致无限递归。

注意:可以通过元对象系统以及从QML。请参阅Q_INVOKABLE。

换句话说,QAbstractItemModel具有2个QObject方法:第一个方法获得模型的QObject父级(因为它是QObject),第二个方法提供模型处理的另一个QModelIndex的QModelIndex父级。] >


(免责声明:我不使用Pycharm或其他IDE来实现自动完成功能)恕我直言Pycharm应该提供两种自动完成功能,以便用户选择要覆盖的方法(请注意,第一种是公共方法,另一种是公共方法。抽象方法)

© www.soinside.com 2019 - 2024. All rights reserved.