Qt 模型的树视图和表视图
Posted
技术标签:
【中文标题】Qt 模型的树视图和表视图【英文标题】:Qt model's tree view and table view 【发布时间】:2009-08-30 12:42:07 【问题描述】:我有一个产品对象列表(作为行),每个对象都有几个数据字段(如产品 ID、产品系列等) - 作为列。我设法创建了一个子类化 QAbstractTableModel 的表模型,并在 QTableView 中显示数据。
我想要的是在树状结构中提供模型的“分组”视图。例如,我想按产品的家庭 id 对产品进行分组,因此树应在第一级包含组(家庭 id)及其子级是具有该家庭 id 的产品。
有什么想法吗?
PS: 需要多个分组(按家庭 id 分组,并按另一列分组,等等)告诉我模型应该是一棵树。根节点表示组,然后子节点是组成员。多级分组可以通过多级树来实现。
然后我的转换问题如下:如何实现一个特殊的 QTableView 类,它只显示树的叶子(在给定的级别)? (因为实际上叶子是我们希望在网格中看到的真实对象)
我可以在tableview中使用setRootIndex,但是解决不了任何问题,其他叶子都不显示。
我稍微挖了一下,发现在QTableView::paintEvent中,显示每一行每一列的时候,实际取到的item是这样的:
const QModelIndex index = d->model->index(row, col, d->root);
其中 d->root() 是由 setRootIndex() 给出的根节点。这应该嵌入到树遍历代码中,一切都会好起来的。但是我怎么能避免重新实现整个paintEvent方法呢?
【问题讨论】:
您是否总是希望它们以相同的方式分组(如按家庭 ID),还是希望在排序顺序更改时更改分组?第一个应该很简单,第二个就不那么简单了。 我创建了一个简单的树模型,并将其设置为不同的视图。下面的示例显示了我希望如何查看树视图,但在表格视图中我会看到产品而不是系列。如何设置表格视图看到模型的二级节点?代码可以在这里找到:stud.u-szeged.hu/Veress.Krisztian/main.cpp 如果您在此处发布您的代码,它就可以被搜索到并且所有人都可以看到 【参考方案1】:根据您想要的定制程度,QTreeWidget 可能是最简单的方法,但如果您已经有模型,则取决于您从哪个模型派生而来。要获得您想要的功能,您需要将子结构添加到您已经构建的行中。您可能错过了它,但“QModelIndex”类有一个“父”字段,这有助于建立层次结构。
参加QStandardItem
和QStandardItemModel
课程可能会让您受益匪浅。它们有一个不错的界面来构建树形结构,具体取决于您需要显示哪些数据,层次结构中的每个级别可以有不同数量的列,并且对深度没有限制。
如果你觉得冒险,你可以从顶部开始,只实现QAbstractItemModel
接口,但有时很难做到这一点。
总的来说,我认为这是 QT 中最奇怪的概念之一,因为 QAbstractItemModel 中存在大量维度(行、列、父/子和角色)
举例
for (int i = 0; i < 3; ++i)
QStandardItem *parent= new QStandardItem("Family " + QString::number(i),this);
item->setRowCount(3);
for (int j = 0; j < 3; ++j)
QStandardItem *child = new QStandardItem("Child " + QString::number(i*3+j), this);
parent->setChild(j,child);
model->appendRow(parent);
免责声明:这还没有编译...
但正如您所见,您需要将子项添加到项目中,而不是模型中,每个项目都可以包含项目的层次结构。
【讨论】:
以上是关于Qt 模型的树视图和表视图的主要内容,如果未能解决你的问题,请参考以下文章