QSortFilterProxyModel造成程序奔溃挂掉,在源模型model删除或增加时

       使用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,  从而出现此问题,其他删除增加情况是否会出现奔溃暂未验证。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值