前幾節中分享過關于自定義排序的功能,貌似我們之前的内容已經可以很好地解決排序問題了,但是,會由此引發一些很難發現的問題。。。比如:擷取qmodelindex索引錯誤。
下面,我們先來實作一個整行選中的效果。
<a href="#%e7%ae%80%e8%bf%b0">簡述</a>
<a href="#%e9%94%99%e8%af%af%e5%a4%84%e7%90%86">錯誤處理</a>
<a href="#%e6%95%88%e6%9e%9c">效果</a>
<a href="#%e6%ba%90%e7%a0%81">源碼</a>
<a href="#%e5%88%86%e6%9e%90">分析</a>
<a href="#%e6%ad%a3%e5%b8%b8%e5%a4%84%e7%90%86">正常處理</a>
<a href="#%e6%95%88%e6%9e%9c-1">效果</a>
<a href="#%e6%ba%90%e7%a0%81-1">源碼</a>
下面是一個非正常的的效果,選中目前行會造成更新錯誤,why?

從上面的代碼中,我們貌似很難發現問題,因為邏輯沒有一點問題,那麼為什麼會造成更新錯誤的問題呢?其實,最本質的原因是擷取索引錯誤,這裡說的索引是指真正的資料源索引,而并非我們看到的選中的索引。
什麼意思呢?舉個例子,如果我們選中的索引為qmodelindex(1, 0)-上圖對應的路徑是d:/qt/image_4.png,因為該索引是我們選中的,也就是排序之後的索引,當我們按照正常思維去更新model的時候,傳遞的索引也是index(1, 0),這時資料源内部是未經過排序的,也就是說qmodelindex(1, 0)所對應的路徑為e:/qt/image_2.png,是以會造成更新錯誤。
如果說你沒發現問題,那麼隻能說純屬偶然,源資料的索引行和你選中的索引行相同。
這裡,至關重要的代碼maptosource-通過選中的索引擷取資料源對應的索引。