使用QTableView,经常会有单选、多选、全选的需求,很多软件提供很简单、直观的方式——复选框。Qt中也可以很容易的进行实现。
如何给表头添加复选框呢?通过以上的介绍,可能很多人都会尝试以下方式来设置表头复选框:
遗憾的是,QTableView在模型中不会调用headerData()函数的Qt::CheckStateRole,因为它与data()函数一样。为什么会出现这种现象呢?因为Qt默认并不支持表头复选框。。。那么,又通过什么方式来为表头添加一个复选框呢?
- 编辑委托
利用委托中重载createEditor(),激活QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。 - 设置QAbstractTableModel的flags()函数,通过重写setData()与data()来实现。
- 使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。
此功能只应该用来显示可视区域内对应一个数据项的静态内容。如果想显示自定义的动态内容或执行自定义编辑器部件,子类化 QItemDelegate代替。也就是说,这只适合做静态数据的显示,不适合做一些插入、更新、删除操作的数据显示。 - 自定义委托,通过paint()方法来实现。这种方式比较复杂,但适合扩展,除了可以嵌入复选框,还可以通过绘制其它控件,按钮、图片等自定义风格。
下面就介绍最常用的方式,即方法二。
QMap用来保存选中行号以及对应的选中状态
setData()方法主要用来设置是否被选中,然后将对应的状态保存到QMap中
data()方法主要用来显示,取出QMap中的值,返回对应的状态
flag()方法主要设置用户可选角色,绘制出QCheckBox
效果如下:
FROM: http://blog.sina.com.cn/s/blog_a6fb6cc90101iang.html