view(如QTreeview) / Model / 数据之间的交互。 View与数据是分离的,数据通过Model进行管理。View 通过调用Model来访问数据。
一、 QTreeView的简单使用,可以如下
QTreeView使用总结1,一个简单示例 这个就是简单的显示。
QTreeView使用总结2,常用API介绍 比如选择,自适应宽度啊...
常用的设置API:
QTreeView* t;
// ------ 表头和列 ------
t->header()->hide(); // 隐藏表头
t->header()->setDefaultSectionSize(100); // 设置默认列宽
t->header()->setDefaultAlignment(Qt::AlignCenter); // 设置表头默认文字对齐
// 一般设置最后一列自适应宽度,让表头初始显示时占满行,效果比较好:
t->header()->setStretchLastSection(true);
// 点击QTreeView时,如果出现该列头文字加粗的情况,可以用下面接口去掉该属性:
t->header()->setHighlightSections(true);
// 当然,项目里的做法一般更细节,可能是对每列分别设置列宽、拉伸属性:
t->header()->resizeSection(0,100); //第1列宽100
t->header()->setSectionResizeMode(3,QHeaderView::Fixed); //第4列定宽
也可以直接使用QTreeView的接口设置列宽:
void setColumnWidth(int column, int width);
设置QTreeView内容按某列排序:
t->header()->setSortIndicator(0,Qt::AscendingOrder); //按第1列升序排序
// ------ 行 ------
// 设置行高:
// QTreeView没有直接提供设置行高的方法,一般的方法是使用Delegate。
// 从QItemDelegate继承,使用QTreeView::setItemDelegate设置。派生类里对sizeHint处理:
QSize MyDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
QSize size = QItemDelegate::sizeHint(option, index);
size.setHeight( size.height() + 4 );
return size;
}
// 我觉得最简单的方法就是直接用qss样式表:
QTreeView::item {
height: 30px;
}
二、 Model/View框架介绍
三、QTreeView的选中信号处理
四、单击双击的信号与事件
五、右键菜单
六、使用委托,定制item
QTreeview 和 Model 之间进行交互。它们是通过 Delegate进行的,没有设置delegate的话,使用的就是默认的 QItemDelegate委托【代码处理逻辑中保存的是QTreeviewPrivate中的是QItemDelegate的基类QAbstractItemDelegate,QAbstractItemDelegate基本为空,具体默认实现就是 QItemDelegate: QAbstractItemDelegate是一个抽象基类】
我们也可以通过setDelegate 来设置我们自己写的delegate
继承QStyledItemDelegate,写一个MyDelegate类:
实现里面的以下方法:
createEditor: 当item激活编辑状态时,显示的内容。这里创建一个QComboBox
setEditorData:用以初始化createEditor里创建的控件内容。这里直接把当前item的text设置为QComboBox选中项。
setModelData:应用编辑后,修改model的data。这里把QComboBox的当前选中项文本设置为item的显示文本。
updateEditorGeometry:更新控件位置状态。
QTreeView使用总结9,使用委托,定制item输入效果
QTreeView使用总结10,使用委托,定制item显示效果 : 这个主要是重写委托的paint函数
七、使用代理model 对基础model功能进一步扩展(比如过滤功能)
代理model 相当于在基础model之外又套了一层,对model 进行了功能扩展,它还是通过model来进行访问数据
QTreeView使用总结11,数据过滤,使用代理model,简单过滤
QTreeView使用总结12,数据过滤,代理model,自定义过滤条件 自定义代理model
八、自定义model
一般树形视图,我们使用的model是QStandardItemModel,基本上就够了,那为什么要自定义model呢,就是特殊功能+性能
前面简单介绍过Qt的模型/视图框架,提到了Qt预定义的几个model类型:
QStringListModel:存储简单的字符串列表
QStandardItemModel:可以用于树结构的存储,提供了层次数据
QFileSystemModel:本地系统的文件和目录信息
QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:存取数据库数据
一般情况下满足需求了,不过有时候需要一些定制功能,或者是大量数据下对性能和开销比较注重,觉得自带的model无用功能太多效率比较低,这时候自定义model就比较适合了。
我使用自定义model 同时出于这两方面需要,既为了性能也为了特殊功能。
QTreeView使用总结13,自定义model示例,大大优化性能和内存
使用自定义model 的时候,一般也会实现 们自定义的指代一个节点的类 TreeItem。详细看下上面的例子。
QTreeView使用总结14,自定义model,控制对齐和颜色
QTreeView使用总结15,自定义model,支持item可编辑
QTreeView使用总结16,定时刷新后,当前选中行的处理
在使用QTreeView展示数据的时候,有些数据是在动态变化的,
这时候也需要动态刷新界面,一般直接更新model即可。
但是存在一个问题:之前的选中状态会丢失。
本文讨论在更新数据时如何处理选中状态。
QTreeView使用总结17:改造QTreeView,实现点击空白处取消选中
QTreeView使用总结18:点击空白处取消选中,简单方法 我还是觉得第一个方法更好