PyQt:垃圾收集器破坏QModelIndex

时间:2015-06-01 13:01:39

标签: python-3.x garbage-collection pyqt

我有一个有目的抽象的模型。我不想为模型中的每个元素创建一个item对象,所以我不能使用QSimpleItem Model。可以把它想象成一个稀疏的巨型矩阵,只存储设定的元素。矩阵被组织为树,其中行作为顶部项,行*列作为子项。

我有以下代码为QAbstractItemModel创建QModelIndexes [仅显示顶级项目的部分,因为它已经失败]:

path = [self.rows[row]]
self.foobar.append(path) # Hack to make path stay alive
return self.createIndex(row, column, path)

我后来在这样的数据中使用它们:

entries = index.internalPointer()
print("entries = {0}".format(entries))
entry = entries[0]
print("entry = {0}".format(entry))

只要我拥有self.foobar hack,这样就可以正常工作。如果我删除它,那么条目在打印条目之前打印为'[[...],b'\ n']'和python segfaults。我的猜测是QModelIndex不会保持内部指针处于活动状态,因此GC会释放它,以后使用会损坏数据。

显然self.foobar hack不是一个合适的解决方案。那么,如果QModelIndex存在多久,我如何保持路径存活?我不想永远保留它,因为在任何时候只有一小部分矩阵是可见的(每个窗口最多一行)并且每行没有一个项目*列是使用QAbstractModel的全部要点。

0 个答案:

没有答案