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,  從而出現此問題,其他刪除增加情況是否會出現奔潰暫未驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章