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的結果相同,但是在不同的許可證下實現不同。
添加回答
舉報