Неправильный шаблон метода для PySide2.QtCore.QAbstractItemModel.parent (): в чем проблема? - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь реализовать подкласс QAbstractItemModel, используя PySide2.

Подпись родительского метода:

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 снова показывает правильный шаблон:

PySide2.QtCore.QAbstractItemModel.parent (child)

Parameters

    child – QModelIndex
Return type

    QModelIndex

Я пробовал PySide 5.14.1, а также 5.13.2.

Что здесь происходит? Это ошибка в PySide2 или PyCharm?

1 Ответ

1 голос
/ 28 марта 2020

ИМХО, думаю, что в обоих случаях (PyQt5 и PySide2) у ошибки в PyCharm есть ошибка.

  • QAbstractItemModel является QObject, поэтому он имеет те же методы QObject, а QObject имеет метод parent () (который является частью иерархии между QObject):

QObject *QObject::parent() const

Возвращает указатель на родительский объект.

  • Также QAbstractItemModel обрабатывает иерархию между QModelIndex, поэтому ему нужен родительский метод (const QModelIndex &), который предоставляет родительский объект QModelIndex другого QModelIndex:

QModelIndex QAbstractItemModel::parent(const QModelIndex &index) const

Возвращает родителя элемента модели с указанным индексом. Если у элемента нет родителя, возвращается недопустимый QModelIndex.

Обычное соглашение, используемое в моделях, которые предоставляют древовидные структуры данных, состоит в том, что только элементы в первом столбце имеют дочерние элементы. В этом случае при переопределении этой функции в подклассе столбец возвращаемого QModelIndex будет равен 0.

При переопределении этой функции в подклассе следует избегать вызова функций-членов QModelIndex, таких как QModelIndex :: parent. (), поскольку индексы, принадлежащие вашей модели, будут просто вызывать вашу реализацию, что приведет к бесконечной рекурсии.

Примечание. Эта функция может вызываться через систему мета-объектов и из QML. Смотрите Q_INVOKABLE.


Другими словами, QAbstractItemModel имеет 2 parent() методов (с другой сигнатурой): первый позволяет получить родительский объект QObject модели (так как это QObject), а второй - тот, который предоставляет родительский объект QModelIndex другого QModelIndex, который обрабатывает модель.


(Отказ от ответственности: я не использую Pycharm или другую IDE для автозаполнения) IMHO Pycharm должен обеспечивать оба автозаполнения чтобы пользователь мог выбрать, какой из методов он хочет переопределить (отметив, что первый - это метод publi c, а другой - абстрактный метод).

Следует отметить, что это не ошибка PySide2 или PyQt5, поскольку эта библиотека предоставляет не автозаполнение, а Pycharm. В качестве заключительного замечания я рекомендую прочитать документы Qt.

Publi c методы не переопределяются (в общем), поэтому наиболее подходящим является автозаполнение def parent(self, QModelIndex=None):, поскольку это абстрактный метод, который должен быть переопределен, если Вы хотите создать экземпляры этого класса.

...