(1)先给出书上的讲解:从原理上来讲,QStandardItemModel 也可以存储树状结构的项数据,与 QTreeView 结合以目录树形式显示数据,实现起来稍微复杂一点,我们就不设计示例来演示了。 :
++在 Qt 的模型与视图架构里,有列表模型 QStringListModel ,表格模型 QStandardItemModel,唯独没有专门的树模型,只是 Qt 官方的大师们为特别常用的文件系统实现了特例树模型 QFilesystemModel。但若不是文件系统,就不可以使用这个特例树模型了。
本篇,咱们尝试完善它,用 普普通通的 QStandardItemModel 来实现树模型。在树模型里,一行是一个节点,虽然一行包含了多列。树模型可以看成是放平的树,树根在最左边,这样就看起来像一棵树了。
(2)
++代码版如下 :
Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget)
{ ui->setupUi(this);
m_QStandardItemModel = new QStandardItemModel(3, 3, this);
m_QStandardItemModel->setHorizontalHeaderLabels({"cA", "cB", "cC"});
QStandardItem * aItem; //这里开始填充表格,生成条目,并加入表格
for(int i = 0 ; i < 3 ; i++)
for(int j = 0; j < 3; j++)
{ aItem = new QStandardItem(QString::number(i * 3 + j));
m_QStandardItemModel->setItem(i, j, aItem);
}
aItem = m_QStandardItemModel->item(1, 0);
aItem->setRowCount (2); //为[1,0] 建立子表,先确定容量
aItem->setColumnCount(3);
QStandardItem * child; //依次往子表里插入 ascii 码字符,只是举例子
for(int i = 0 ; i < 2 ; i++)
for(int j = 0; j < 3; j++)
{ child = new QStandardItem( QString(char('a' + i * 3 + j)) );
aItem->setChild(i, j, child);
}
ui->treeView->setModel(m_QStandardItemModel); //这里必须采用树视图
}
++运行效果如下 :
(3)补充:由二维表来构造树表,只可以为每一行的第一列扩充成子表。而且子表还是二维表。学过 mysql
数据库的都知道,所谓关系,就是二维表。QT 里的表格,大致就是图示的这种结构 :
(4)
谢谢