PyQt 示例 editabletreemodel.py 在删除最后一行时崩溃
PyQt example editabletreemodel.py crashes when the last row is removed
在 editabletreemodel.py 示例中(来自 PyQt examples/itemviews 文件夹)我注意到当最后一行被删除(例如,读取“连接编辑模式”或之后的任何其他内容)应用程序崩溃并显示
'IndexError: list index out of range'.
会不会是因为示例在创建索引等时保留了 TreeItem 对象而不是 id?我有非常相似的问题,只是想知道保留 id 而不是对象是否更好?或者像这样检查是否请求超过限制的行是安全的:
def child(self, row):
if row >= self.childCount():
return None
return self.childItems[row]
我使用 Python 版本 2.7.9 和 PyQt 版本“4.9.6”。
提前致谢。
这应该作为 pyqt mailing-list 上的错误报告。
原Qt example声明childItems
为:
QList<TreeItem*> childItems;
并将 child()
函数定义为:
TreeItem *TreeItem::child(int number)
{
return childItems.value(number);
}
这不会进行任何明确的边界检查,因为如果 number
超出范围,value()
将简单地 return null。但显然 python 列表的行为方式不同,因此需要进行明确的边界检查:
def child(self, row):
if 0 <= row < self.childCount():
return self.childItems[row]
在 editabletreemodel.py 示例中(来自 PyQt examples/itemviews 文件夹)我注意到当最后一行被删除(例如,读取“连接编辑模式”或之后的任何其他内容)应用程序崩溃并显示
'IndexError: list index out of range'.
会不会是因为示例在创建索引等时保留了 TreeItem 对象而不是 id?我有非常相似的问题,只是想知道保留 id 而不是对象是否更好?或者像这样检查是否请求超过限制的行是安全的:
def child(self, row):
if row >= self.childCount():
return None
return self.childItems[row]
我使用 Python 版本 2.7.9 和 PyQt 版本“4.9.6”。
提前致谢。
这应该作为 pyqt mailing-list 上的错误报告。
原Qt example声明childItems
为:
QList<TreeItem*> childItems;
并将 child()
函数定义为:
TreeItem *TreeItem::child(int number)
{
return childItems.value(number);
}
这不会进行任何明确的边界检查,因为如果 number
超出范围,value()
将简单地 return null。但显然 python 列表的行为方式不同,因此需要进行明确的边界检查:
def child(self, row):
if 0 <= row < self.childCount():
return self.childItems[row]