在windows中我们经常会遇到表头排序,比如可以对文件按照名称、修改日期、类型、大小进行排序,方便我们统一的归类查找。
qt中,我们可以通过点击表头来对qtableview或qtreeview等一系列高级视图进行排序,对于一般的数据来说-比如:int、qstring等,简单的几句代码就可以搞定,因为qt内部做了很好的排序处理,但是一般情况下,我们需要处理一些特殊格式的数据,这时,我们就不得不自己处理,以达到理想的效果。
<a href="#%e7%ae%80%e8%bf%b0">简述</a>
<a href="#%e6%95%88%e6%9e%9c">效果</a>
<a href="#%e8%87%aa%e5%ae%9a%e4%b9%89%e6%95%b0%e6%8d%ae">自定义数据</a>
<a href="#qabstracttablemodel">qabstracttablemodel</a>
<a href="#%e6%ba%90%e7%a0%81">源码</a>
<a href="#%e6%8e%a5%e5%8f%a3%e8%af%b4%e6%98%8e">接口说明</a>
<a href="#%e4%bd%bf%e7%94%a8">使用</a>
<a href="#%e6%80%9d%e8%80%83">思考</a>

定义各列数据及结构体
自定义模型
updatedata
主要用于更新数据,刷新界面。
data
用来显示数据,根据角色(颜色、文本、对齐方式、选中状态等)判断需要显示的内容。
setdata
用来设置数据,根据角色(颜色、文本、对齐方式、选中状态等)判断需要设置的内容。
headerdata
用来显示水平/垂直表头的数据。
flags
用来设置单元格的标志(可用、可选中、可复选等)。
细心地童鞋可能会发现,当点击表头(文件名)的时候,如果按照升序排列时,顺序依次是:name 14、name 19、name 4、name 8、name 9,降序则相反。为什么呢?
其实这个很好理解,因为文件名所在的列显示的数据类型为qstring,而qstring排序是按照第一个字母开始比较,直至最后一个字母,例如:name 19和name 4,首先比较name是相同的,当比较1和4(注意这里不是按照整形比较19和4)的时候,发现1比4小,所以name 19排在name 4之前。
对于文件大小的显示,一般情况下,我们显示的是kb、mb、gb等单位,而不会显示字节,那么按照1的说法,在这种情况下,升序排列时,10 k 就会排在8 k之前了,所以我们应该避免这种问题。
上面所述的简单排序谁都会,如何把前面的数据按照字符串比较,而后面的数据按照整形比较呢?如何将整形显示为字符串,而排序依然正常呢?这都是我们下节要分享的精彩内容,请持续关注!