0、前言
在使用QT做数据表格展示的时候,很大部分要用到表格,列表或者类型树形的结构,QT中常用的控件显示有item view(List 、Tree、Table、Colum、undo view)还有 item wigets(List 、Tree、Table、Colum、undo view)如何选用呢,主要看两者区别和联系:
0.1 联系
从继承关系来说, item wigets都是继承来自对应的 item wiew,在功能上一般来说items widget更易用。
0.2 区别
1、 item wigets 使用起来更简单,而 item wiew 的用法相对比较复杂。
2、item views 可以存储大量的数据(例如几十万甚至几百万),用户浏览表格中的数据时不会出现卡顿等现象;尽管 item wigets 也能用来存储大量的数据,但用户使用时可能出现卡顿等现象,且显示的数据越多,类似的现象越明显。
3、二者在加载数据源时候不一样:item views 通过数试图/模型方式将数据与展示分开,所以使用时还需做数据的绑定,同事修改数据直接在model修改,item wigets数据来源可认为通过函数正常加载,使用起来更方便。
以下以一个具体的例子展示( item wigets 选用QTableWidget , item wiew 选用QTableView )
4、其他的view主要功能:
QListView:用于显示单列的列表数据,适用于一维数据的操作
QTreeView:用于显示树状结构数据,适用于树状结构数据的操作
QTableView:用于显示表格状数据,适用于二维表格型数据的操作
QColumnView:用多个QListView显示树状层次结构,树状结构的一层用一个QListView显示
QHeaderView:提供行表头或列表头的视图组件,如QTableView的行表头和列表头
UI 控件面板上有这两种类型,当然也可以直接在定义。
1、item views(以QTableView为例子)
view使用简单代码如下:(省略部分头文件的包含)
Widget::Widget(QWidget *parent): QTableView(parent)
{
QStandardItemModel* model = new QStandardItemModel(this);
model->setItem(0, 0, new QStandardItem("test1"));
model->setItem(0, 1, new QStandardItem("test2"));
model->setItem(0, 2, new QStandardItem("test3"));
this->setModel(model);
}
很简单,直接一个view塞进去一个model,所有数据的修改都在model函数,界面的展示都在view上,这里虽然没有出现代理,但是其实已经使用默认的代理:QStyledItemDelegate;
2、item widgets(以QTableWidget为例子)
QTableWidget使用简单代码如下:(省略部分头文件的包含)
//设置表头
TableWidget.setHorizontalHeaderLabels(QStringList() << "1" << "2" << "3");
//设置表格中每一行的内容
TableWidget.setItem(0,0,new QTableWidgetItem("test1"));
TableWidget.setItem(0,1,new QTableWidgetItem("test1"));
对新手很友好,设置简单。
3、自定义
我自己理解的视图-模型-代理之间的关系:试图其实就是展示的部分,比如ui展示部分,模型其实是数据的一种集合方式,代理其实定义一种如何在试图展示数据的方式,三者都有默认的类型。
这里只说View/model情况,什么情况下需要重新编辑model或者delegeta呢
1、在使用标准的model,如QStandardiTemModel,在提供数据的时候,可能达不到我们想要的优化,比如实时数据的时候,这时候我们可以重新继承QStandardiTemModel或者QAbstractItemModel 重新实现 data函数
2、在重新定义delegate的时候,主要是为了定制化的东西,如在表格中有下拉框,勾选框这样的内容,是默认的情况下无法达到需求,此时需要自定义delegate。
在这里建议主要建议继承自QStyledItemDelegate(下面懒得打字)