3 回答
TA贡献1796条经验 获得超4个赞
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 ++中,parent参数作为const
引用传递,因此不会被beginInsertRows
函数删除或更改。
我认为,如果C ++实例在仍被Python引用时被删除,则可能会发生分段错误,这是您最大的问题。
现在在Python中,在函数定义中创建的参数通常具有较长的寿命,并且可能有一些我不知道的删除实例的方法,但是通常您应该是安全的。
如果您对此感到担心,则只需每次都创建一个新实例。
index =索引或QtCore.QModelIndex()
但是出于我的价值,我不记得在函数定义中创建索引实例有麻烦,而且我已经在很多场合这样做了。
TA贡献1818条经验 获得超8个赞
首先,按我的方式做的原因:
要求是
insertRows
“如果未指定parent,则每次调用时都要实例化一个新的QModelIndex”。Python仅为关键字参数分配一个默认值-不会在每次调用时分配默认值。
所以这是我的解决方案:
def insertRows(self, row, count, index=None):
index = index or QtCore.QModelIndex()
# do other stuff
TA贡献1877条经验 获得超6个赞
这是我在程序中添加开始和结束的方式:
def insertRows(self, row, count, index):
self.beginInsertRows(index, row, count)
""" Your stuff here
"""
self.endInsertRows()
还请查看pyside docs,因为它们通常比pyqt更好,并且在LGPL之下,因此您可以将其用于商务。IIRC的结果相同,但是在不同的许可证下实现不同。
添加回答
举报