QTableView Optimization ⑵

img

书接上文,我们继续来聊聊 QTableView 上功能的优化

new features

Hierarchical headers

多级表头,QTableView 原生不支持,需要我们继承 QHeaderView,自己实现

主要是通过 QPainter 实现 QHeaderView 的 paintSection 函数

img

测试代码1

为了方便说明,精简了大量代码

但是重要的绘制代码,我没有用循环,而是重复了 5 遍

主要为了强调表头绘制并没有什么复杂的代码

paintSection 函数会在每个 section 绘制的时候调用

一个 section 就代表一列,图中有 7 个 section

我们来看 drawControl,它有 4 个参数,CE_HeaderLabel 代表绘制文字

opt 是文字的各项参数,这里主要设置了文字所占矩形框的大小

fillRect 是为每个矩形框绘制白色底色

drawLine 是为每个矩形框绘制底部和右侧的边框线

Frozen columns

冻结列,官方提供了一个只有左冻结列的 example

主要思路是继承 QTableView 创建两个 TableViewBase,

然后将一个TableViewBase 叠在另一个 TableViewBase 上,但只显示左边几列,代表冻结列

最后绑定一些信号槽,使滚动条和鼠标事件有效

参考这个思路,我们可以写出右冻结列,上冻结行,下冻结行,固定位置的汇总行

img

测试代码2

代码中对左侧两列做了冻结,对最后一列做了冻结,

最关键的有两处:

第32行,viewport()->stackUnder(leftFrozenTableView); 将原本的表格放置到最后;

最后两行 setGeometry,设置左冻结列和右冻结列的大小及位置

Dragged columns

表头拖动

测试代码3

img

首先设置支持 drag setDragEnabled``(``true``)

然后设置支持 drop setAcceptDrops(true)

接着设置几个拖放事件的函数

最后是最关键的 mousePress 事件的定义

我们创建了一个 QPixmap,然后用 paintSection 类似的代码画了文字和边框,

最后把这张图片交给 QDrag,就能在拖动的时候看到半透明的图片了