QT:QListView实现table自定义代理
介绍
QListVIew有两种切换形式,QListView::IconMode和QListView::ListMode,通过setViewMode()进行设置切换。因为QListView可以像QTreeView一样显示树形结构,也可以分成多列。这次目标是将ListView的ListMode形态显示为table。使用代理,使用paint进行手动绘制,实现table内容效果,但是QListView没有标题,所以要额外写一个QheadView作为表头。
ui就如上面所说的设计,上面自定义一个headview作为表头,下面放一个listview。
下面分为2部分介绍实现:表头和表格内容。
一、表头
表头使用QHeadVIew,不用QLable的原因是headview带有鼠标事件、列宽拖拽,比较方便。
注意点:
1、如果在paint中需要贴图的(QImage),最好将image写成私有变量,在函数初始化的时候生成。因为在paint里生成一个image就会出现每绘制一个就生成一次,出现多次重复加载iamge。
2、局部绘制的判断要使用局部变量!!paint函数中进行鼠标位置判断,不要使用全局变量的矩阵与鼠标位置进行判断。paint函数属于局部的,所以在paint中所有涉及位置判断的,比如判断鼠标是否在一个Rect内,那么这个rect必须是在paint里定义赋值的,不能是全局变量,会出现问题(问题是位置高的判断不对)。这个在表格内容绘制的时候一样的。比如想在表格中实现button效果,鼠标点击在具体rect中时,发出按钮点击信号,那么这个rect也只能是paint里定义的局部变量,不能是全局。
二、表格内容
注意点:
1、鼠标事件获取。
首先是确保鼠标追踪开启。ui->listView->setMouseTracking(true);
所有的鼠标事件判断在editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)函数中写。
2、数据驱动界面绘制!!比如说,我需要实现checkbox的样式,判断item是否被点击勾选,那么可以将是否被勾选塞入item的UserRole中,在paint的时候判断userrole中对应的值为true还是false进行绘制对应状态。