使用QSortFilterProxyModel排序过滤模型实现某一个排序功能,整个功能OK,但是在删除某一行或者增加某一行的时候,程序无名奔溃死掉。多次检查程序实现过程、调试发现自己代码均无问题,初步定位QT库本身内部奔溃。
工程环境:QT4 使用视图模型,QAbstractTableModel/QTableView ,使用QSortFilterProxyModel代理类实现排序
使用QSortFilterProxyModel后,程序出现奔溃,采用以下解决问题:
1. 屏蔽排序过滤模型QSortFilterProxyModel,在视图中直接使用QAbstractTableModel表格模型,多次增加、删除均无问题,故此排猜想是QSortFilterProxyModel代理造成程序奔溃,调试程序,挂掉位置还是无法定位。
2. 百度搜索未找到关于类QSortFilterProxyModel的使用造成程序奔溃的解决方法,搜索显示,某些开发人员使用类QSortFilterProxyModel来排序过滤,并在删除某一条目时,确实会造成程序奔溃,却没有解决方法。仔细阅读帮助文档,发现排序过滤代理类QSortFilterProxyModel通过映射关联原模型(本文使用QAbstractTableModel),达到排序、过滤数据,从而在View视图中显示。故此猜想,在model中增加、删除数据时,QSortFilterProxyModel代理类对于model的关联映射关系并没有完全清除,从而造成程序无辜挂掉。
3. 通过第二步分析,检查程序,发现在给model重新设置数据时,使用了layoutChanged()信号,猜想该发送该信号后model中模型视图映射关系并没有完全清除,故将该信号函数用reset()函数代替 ,( QT5中已经删除reset函数,可使用 QAbstractItemModel::beginResetModel() QAbstractItemModel::endResetModel() ),在次编译运行程序,多次测试均不会奔溃,问题解决。
本文使用增加删除是在ui对应CPP文件中直接增加、删除结构中某一条目,然后将整体结构传入model, 从而出现此问题,其他删除增加情况是否会出现奔溃暂未验证。