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