Python 尝试重写QTreeView.edit()时获取最大递归错误
标题说明了其中的大部分。我在这里一定是有些愚蠢,但出于某种原因,每当我右键单击Treeview时试图覆盖QTreeView的编辑功能时,我会得到一个最大递归深度错误 这是我尝试调用super的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
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)