Ошибка получения максимальной рекурсии при попытке переопределить QTreeView.edit () - PullRequest
1 голос
/ 20 сентября 2019

В названии написано больше всего.Я должен быть чем-то глупым здесь, но по какой-то причине в любое время я пытаюсь переопределить функцию редактирования QTreeView, когда я щелкаю правой кнопкой мыши на TreeView, я получаю ошибку максимальной глубины рекурсии.

Это конкретно, когда я пытаюсь вызвать функцию редактирования супер.Вот пример проблемы.Что я тут испортил?

from PyQt5 import QtWidgets, QtGui, QtCore


class EditTreeView(QtWidgets.QTreeView):

    editingRequested = QtCore.pyqtSignal(QtCore.QModelIndex)

    def __init__(self, parent=None):
        super(EditTreeView, self).__init__(parent)

    def edit(self, index, QAbstractItemView_EditTrigger=None, QEvent=None):
        super(EditTreeView, self).edit(index)


class testTreeview(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(testTreeview, self).__init__(parent)
        self.mainTree = EditTreeView()
        self.lo = QtWidgets.QVBoxLayout()
        self.lo.addWidget(self.mainTree)
        self.setLayout(self.lo)
        self.model = QtGui.QStandardItemModel()
        self.mainTree.setModel(self.model)

    def populate(self):
        row = [QtGui.QStandardItem('teststuff'), ]
        root = self.model.invisibleRootItem()
        root.appendRow(row)


if __name__ == "__main__":
    from PyQt5 import QtCore, QtGui, QtWidgets

    app = QtWidgets.QApplication([])
    volume = testTreeview()
    volume.show()
    app.exec_()

1 Ответ

1 голос
/ 20 сентября 2019

Объяснение:

QTreeView наследуется от QAbstractItemView, и если вы просматриваете методы этого класса, вы увидите, что есть 2 метода с одинаковым именем:

bool QAbstractItemView :: edit (const QModelIndex & index, триггер QAbstractItemView :: EditTrigger, событие QEvent *)

Начинает редактирование элемента в индексе, при необходимости создает редактор ивозвращает true, если состояние представления теперь EditingState;в противном случае возвращает false.

Действие, которое вызвало процесс редактирования, описывается триггером, а связанное событие указывается событием.

Редактирование можно принудительно указать, указав триггер QAbstractItemView ::AllEditTriggers.


void QAbstractItemView :: edit (const QModelIndex & index)

Начинает редактирование элемента, соответствующегок данному индексу, если он доступен для редактирования.

Обратите внимание, что эта функция не меняет текущий индекс.Поскольку текущий индекс определяет следующий и предыдущий элементы для редактирования, пользователи могут обнаружить, что навигация с помощью клавиатуры не работает должным образом.Чтобы обеспечить согласованное поведение при навигации, вызовите setCurrentIndex () перед этой функцией с тем же модельным индексом.

Замечено, что первый метод является более общим, чем второй, поэтому он дает нам подозрение, чтовторой будет использовать первый, и это действительно происходит, если исходный код проверен:

<code>void QAbstractItemView::edit(const QModelIndex & index)
{
    Q_D(QAbstractItemView);
    if (Q_UNLIKELY(!d->isIndexIsValid(index)))
        qWarning("edit: index was invalid");
    if (Q_UNLIKELY(!<b>edit(index, AllEditTriggers, 0)</b>))
        qWarning("edit: editing failed");
}

Так что в вашем случае четко объяснитеошибка: вы переопределяете первый метод и вызываете второй, но второй использует первый в соответствии с исходным кодом и возвращается к бесконечному циклу.


Решение

Решениеиспользовать супер-метод одного и того же метода со всеми параметрами:

class EditTreeView(QtWidgets.QTreeView):
    editingRequested = QtCore.pyqtSignal(QtCore.QModelIndex)

    def edit(self, index, trigger, event):
        self.editingRequested.emit(index)
        return super(EditTreeView, self).edit(index, trigger, event)

Но имейте в виду, что переопределение относится к первому методу, в C ++ разрешено иметь методы с тем же именем, но вpython, если есть несколько методов с одинаковым именем, последний из них удалит предыдущие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...