Объяснение:
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, если есть несколько методов с одинаковым именем, последний из них удалит предыдущие.