3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
和
def insertRows(self, row, count, index=QtCore.QModelIndex()):
這兩個(gè)示例均導(dǎo)致無效的索引實(shí)例。
什么是無效的QModelIndex?
可以使用QModelIndex構(gòu)造函數(shù)構(gòu)造無效的模型索引。當(dāng)引用模型中的頂級(jí)項(xiàng)目時(shí),無效索引通常用作父索引。
不insertRows每次被調(diào)用時(shí),需要一個(gè)新的無效實(shí)例?
對(duì)于insertRows函數(shù),該函數(shù)的基類實(shí)現(xiàn)不執(zhí)行任何操作,并返回false。
引用意味著如果您使用它,則QAbstractItemModel
需要實(shí)現(xiàn)insertRows
自己。這意味著您需要調(diào)用帶父參數(shù)的beginInsertRows。
當(dāng)涉及到父索引時(shí),Qt的C ++端將不在乎給定哪個(gè)實(shí)例。只要它是無效的,就意味著當(dāng)前項(xiàng)目在模型的頂層,并且沒有父項(xiàng)。
QAbstractItemModel
不應(yīng)刪除它自身未創(chuàng)建的任何索引。在C ++中,parent參數(shù)作為const
引用傳遞,因此不會(huì)被beginInsertRows
函數(shù)刪除或更改。
我認(rèn)為,如果C ++實(shí)例在仍被Python引用時(shí)被刪除,則可能會(huì)發(fā)生分段錯(cuò)誤,這是您最大的問題。
現(xiàn)在在Python中,在函數(shù)定義中創(chuàng)建的參數(shù)通常具有較長的壽命,并且可能有一些我不知道的刪除實(shí)例的方法,但是通常您應(yīng)該是安全的。
如果您對(duì)此感到擔(dān)心,則只需每次都創(chuàng)建一個(gè)新實(shí)例。
index =索引或QtCore.QModelIndex()
但是出于我的價(jià)值,我不記得在函數(shù)定義中創(chuàng)建索引實(shí)例有麻煩,而且我已經(jīng)在很多場合這樣做了。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
首先,按我的方式做的原因:
要求是
insertRows
“如果未指定parent,則每次調(diào)用時(shí)都要實(shí)例化一個(gè)新的QModelIndex”。Python僅為關(guān)鍵字參數(shù)分配一個(gè)默認(rèn)值-不會(huì)在每次調(diào)用時(shí)分配默認(rèn)值。
所以這是我的解決方案:
def insertRows(self, row, count, index=None):
index = index or QtCore.QModelIndex()
# do other stuff

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是我在程序中添加開始和結(jié)束的方式:
def insertRows(self, row, count, index):
self.beginInsertRows(index, row, count)
""" Your stuff here
"""
self.endInsertRows()
還請查看pyside docs,因?yàn)樗鼈兺ǔ1萷yqt更好,并且在LGPL之下,因此您可以將其用于商務(wù)。IIRC的結(jié)果相同,但是在不同的許可證下實(shí)現(xiàn)不同。
添加回答
舉報(bào)