Python 尝试重写QTreeView.edit()时获取最大递归错误

Python 尝试重写QTreeView.edit()时获取最大递归错误,python,pyqt,pyqt5,qtreeview,Python,Pyqt,Pyqt5,Qtreeview,标题说明了其中的大部分。我在这里一定是有些愚蠢,但出于某种原因,每当我右键单击Treeview时试图覆盖QTreeView的编辑功能时,我会得到一个最大递归深度错误 这是我尝试调用super的edit函数时特别需要的。下面是一个问题的例子。我搞砸了什么 from PyQt5 import QtWidgets, QtGui, QtCore class EditTreeView(QtWidgets.QTreeView): editingRequested = QtCore.pyqtSi

标题说明了其中的大部分。我在这里一定是有些愚蠢,但出于某种原因,每当我右键单击Treeview时试图覆盖QTreeView的编辑功能时,我会得到一个最大递归深度错误

这是我尝试调用super的edit函数时特别需要的。下面是一个问题的例子。我搞砸了什么

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_()
说明: QTreeView继承自QAbstractItemView,如果查看该类的方法,可以看到有两个同名的方法:

在索引处开始编辑项目,必要时创建编辑器,然后 如果视图的状态现在为EditingState,则返回true;否则 返回false

导致编辑过程的操作由触发器描述, 关联的事件由事件指定

可以通过指定要编辑的触发器来强制编辑 QBStractItemView::AllEditTriggers


开始编辑与给定索引对应的项(如果是) 可编辑

请注意,此函数不会更改当前索引。自从 当前索引定义要编辑的下一个和上一个项目,用户可以 发现键盘导航未按预期工作。提供 一致的导航行为,在此之前调用setCurrentIndex() 具有相同模型索引的函数

据观察,第一种方法比第二种更为普遍,因此我们怀疑第二种方法会使用第一种方法,事实上,如果审查:


<>但请记住,重写是第一种方法,在C++中,允许使用同名的方法,但在Python中如果有几个同名的方法,最后一个将擦除以前的方法。看来你最近解决了我所有的问题。
void QAbstractItemView::edit(const QModelIndex & index)
{
    Q_D(QAbstractItemView);
    if (Q_UNLIKELY(!d->isIndexIsValid(index)))
        qWarning("edit: index was invalid");
    if (Q_UNLIKELY(!edit(index, AllEditTriggers, 0)))
        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)