Qt模型的树视图和表视图

时间:2009-08-30 12:42:07

标签: qt model views

我有一个Product对象列表(作为行),每个对象都有几个数据字段(如产品ID,产品系列等) - 作为列。我设法创建了一个子类化QAbstractTableModel的表模型,并在QTableView中显示数据。

我想要的是在树状结构中提供模型的“分组”视图。例如,我想按照其家庭ID对产品进行分组,因此树应该在第一级包含组(家庭ID),并且他们的孩子是具有该家庭ID的产品。

有什么想法吗?

PS: 需要多个分组(按族ID分组,并按另一列分组,等等)向我显示模型应该是树。根节点表示组,然后子节点是组成员。多级分组可以通过多级树来实现。

然后我转换的问题如下:我如何实现一个特殊的QTableView类,它只显示树的叶子(在给定的级别)? (因为实际上叶子是我们希望在网格中看到的真实对象)

我可以在tableview中使用setRootIndex,但它没有解决任何问题,也没有显示其他叶子。

我正在挖掘一点,发现在QTableView :: paintEvent中,当显示每一行和每列时,实际的项目被提取为:

const QModelIndex index = d-> model-> index(row,col,d-> root);

其中d-> root()是setRootIndex()给出的根节点。这应该嵌入到树遍历代码中,一切都会好的。但是我怎么能避免重新实现整个paintEvent方法呢?

1 个答案:

答案 0 :(得分:1)

根据您想要的自定义程度,QTreeWidget可能是最简单的路线,但如果您已经拥有模型,则取决于您派生的模型。要获得您希望的功能,您需要将子结构添加到已经构建的行中。你可能错过了它,但'QModelIndex'类有一个'parent'字段,这有助于建立一个层次结构。

参加QStandardItemQStandardItemModel课程可能会很好。它们具有构建树结构的良好界面,具体取决于显示层次结构中每个级别所需的数据可以具有不同数量的列,并且对深度没有限制。

如果你觉得冒险,你可以从顶部开始,只需实现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);
}

免责声明:尚未编译......

但正如您所看到的,您需要将子项添加到项目而不是模型中,每个项目都可以包含项目层次结构。