我有一个产品对象列表(作为行),每个对象都有几个数据字段(如产品 ID、产品系列等) - 作为列。我设法创建了一个表模型子类化 QAbstractTableModel,并在 QTableView 中显示数据。
我想要的是在树状结构中提供模型的“分组” View 。例如,我想按产品的家庭 id 对产品进行分组,因此树应该在第一级包含组(家庭 id)和他们的 child 是具有该家庭 id 的产品。
有任何想法吗?
PS:
需要多个分组(按家庭 id 分组,并按另一列分组,等等)告诉我模型应该是一棵树。根节点表示组,然后子节点是组成员。多级分组可以通过多级树来实现。
然后我的转换问题如下:如何实现一个特殊的 QTableView 类,它只显示树的叶子(在给定的级别)? (因为实际上叶子是我们希望在网格中看到的真实对象)
我可以在 tableview 中使用 setRootIndex,但它没有解决任何问题,其他叶子不显示。
我稍微挖掘了一下,发现在 QTableView::paintEvent 中,当显示每一行和每一列时,实际的项目是这样获取的:
const QModelIndex index = d->model->index(row, col, d->root);
其中 d->root() 是由 setRootIndex() 给出的根节点。这应该嵌入到树遍历代码中,一切都会好起来的。但是我怎么能避免重新实现整个paintEvent方法呢?
最佳答案
取决于你想要多少定制 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 模型的 TreeView 和表格 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1353795/