本节主要解决自定义排序衍生的第二个问题-将整形显示为字符串,而排序依然正常。
下面我们介绍三种方案:
委托绘制
用户数据
辅助列
很多人也许会有疑虑,平时都用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);
小小一个排序居然也有这么多门道,真是条条大路通罗马,通过这几节的分享,想必大家对排序有了更深入的了解,更多的知识请参考官方文档。