在Qt中,在qabstractemmodel中有这个例程(以及其他例程)
bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
它基本上在每次调用一个新的QModelIndex时实例化它,如果没有指定parent。
在python中,同一行的含义大不相同:每次调用时只实例化和共享一个QModelIndex
我不清楚的是PyQt是如何处理这种差异的。“AA>”似乎是从C++中自动生成的,因此默认参数实例化使用相同的语法,但具有完全不同的含义,使问题未得到解决。
这个问题当然会在qabstractemmodel的PyQt中进行定制的重新实现。你应该申报
def insertRows(self, row, count, index=QtCore.QModelIndex()):
或
def insertRows(self, row, count, index=None):
如果index为None,则实例化一个新的QModelIndex?
最佳答案
bool insertRows(int row, int count,
const QModelIndex &parent = QModelIndex());
和
def insertRows(self, row, count, index=QtCore.QModelIndex()):
这两个示例都会导致索引实例无效。
什么是无效的QModelIndex?
可以使用QModelIndex构造无效的模型索引
构造器。当
引用模型中的顶级项。
每次调用insertRows时是否需要新的无效实例?
在insertRows函数的情况下,基类实现
此函数不执行任何操作并返回false。
引用的意思是,如果使用
QAbstractItemModel
,则需要自己实现insertRows
。这意味着您需要调用beginInsertRows来获取父参数。
当涉及父索引时,Qt的C++侧将不关心给定哪个实例。只要它无效,就意味着当前项处于模型的顶层,并且没有父项。
QAbstractItemModel
不应删除它自己未创建的任何索引。在C++中,父参数被传递为
const
引用,因此不会被beginInsertRows
函数删除或更改。如果在Python中引用了C++实例,则可能会出现分割错误,这是您认为最大的问题。
现在在Python中,在函数定义中创建的参数通常有很长的生命周期,并且可能有一些方法可以删除实例,我不知道,但通常情况下您应该是安全的。
如果您对此感到担心,只需每次创建新实例。
index = index or QtCore.QModelIndex()
但值得一提的是,我不记得在函数定义中创建索引实例时遇到了问题,而且我已经多次这样做了。