本節主要解決自定義排序衍生的第二個問題-将整形顯示為字元串,而排序依然正常。
下面我們介紹三種方案:
委托繪制
使用者資料
輔助列
很多人也許會有疑慮,平時都用delegate來繪制各種按鈕、圖示、圖形等操作,它還能排序?當然,它本身是不會排序的,但他的進階用法之一就是-輔助排序。
<a href="#%e7%ae%80%e8%bf%b0">簡述</a>
<a href="#%e5%a7%94%e6%89%98%e7%bb%98%e5%88%b6">委托繪制</a>
<a href="#%e6%95%88%e6%9e%9c">效果</a>
<a href="#qstyleditemdelegate">qstyleditemdelegate</a>
<a href="#%e7%9c%bc%e8%a7%81%e4%b8%8d%e4%b8%80%e5%ae%9a%e4%b8%ba%e5%ae%9e">眼見不一定為實</a>
<a href="#%e7%94%a8%e6%88%b7%e6%95%b0%e6%8d%ae">使用者資料</a>
<a href="#qabstracttablemodel">qabstracttablemodel</a>
<a href="#qsortfilterproxymodel">qsortfilterproxymodel</a>
<a href="#%e8%be%85%e5%8a%a9%e5%88%97">輔助列</a>
<a href="#%e6%95%88%e6%9e%9c-1">效果</a>
<a href="#qabstracttablemodel-1">qabstracttablemodel</a>
<a href="#qsortfilterproxymodel-1">qsortfilterproxymodel</a>
<a href="#%e9%9a%90%e8%97%8f%e8%be%85%e5%8a%a9%e5%88%97">隐藏輔助列</a>
<a href="#%e6%80%bb%e7%bb%93">總結</a>

我們可以通過設定顯示的文本,然後調用qstyle的drawcontrol來進行viewitem的繪制。繪制之後,資料源中的資料依然是qint64的,而我們看到的是繪制之後的文本-qstring類型,這樣qsortfilterproxymodel預設排序(根據源資料排序)就可以滿足我們的要求了。
通過效果圖我們也可以很明顯的看出來,其實内部的資料并不是界面顯示的字元串,而是原始的qint64類型的資料。
顯示在界面的資料為displayrole中的資料,我們可以看到已經通過bytestogbmbkb轉化為字元串,這時我們可以通過設定userrole添加使用者資料将源資料存儲起來。
根據使用者源資料進行排序。
設定輔助資料
這裡對第三列進行排序,因為第三列的資料是字元串(當然,也可以反轉換),是以使用的輔助列資料,擷取位元組大小後進行對比。
一般來說,輔助列(資料)隻對我們處理資料有幫助,而不直接顯示在界面上,是以我們可以将其隐藏ptableview->setcolumnhidden(file_size_hidden_column, true);
小小一個排序居然也有這麼多門道,真是條條大路通羅馬,通過這幾節的分享,想必大家對排序有了更深入的了解,更多的知識請參考官方文檔。