我想创建一个2列的QTreeview。到目前为止,这没有问题。我使用以下代码实现了这一点:

QStandardItemModel *model = new QStandardItemModel(0,2);
ui->treeView->setModel(model);


现在,我要填充此TreeView。为此,我创建了一个带有0行和1列的QStandardItem。

QStandardItem *root = new QStandardItem(0,2);


之后,我向该根项目添加了数据。

root->setText("name");
root->setData("value", 1);


最后,我将模型添加到QTreeView中

ui->treeView->setModel(model);


问题是,该值未显示在QTreeView的第二列中。我确信,原因是该模型的第二列与根项目的第二列不同。

但是如何解决这个问题呢?

最佳答案

您无需指定行数或列数,只需专注于将元素添加到模型中,它将关注内部细节。

在这个最小的示例中,创建了一个模型,该模型填充了三个父级(外部循环),每个子级有3个,2个和1个子级(内部循环)。也就是说,模型总共有(1 + 3)+(1 + 2)+(1 +1)= 9行,每行有两列用于子项(名称和数据),而对于子项则只有一列父母(只有名字,请注意添加的0作为第二个值)。

QStandardItemModel * model = new QStandardItemModel;

QStandardItem * root = model->invisibleRootItem();

QList<QStandardItem*> rowItems;
for (int i = 0; i < 3; ++i) {
    QString parentName = QString("Parent #%1").arg(i + 1);
    QStandardItem* parent = new QStandardItem(parentName);
    rowItems << parent << 0;
    root->appendRow(rowItems);
    rowItems.clear();

    for (int j = 0; j < 3 - i; ++j) {
        QString childName = QString("Child %1-%2").arg(i + 1).arg(j + 1);
        QStandardItem* item = new QStandardItem(childName);
        int content = (i + 1) * (j + 1) * 2700;
        QStandardItem* itemData = new QStandardItem(QString("%1").arg(content));
        rowItems << item << itemData;
        parent->appendRow(rowItems);
        rowItems.clear();
    }
}

model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Data"));

ui->treeView->setModel(model);


请注意,此示例使用的步骤是:


创建模型
逐行填充模型。每行是一个QStandardItem元素(rowItems)的列表,并将该行附加到其父项(如果是第一级元素,则附加到根项)。
设置模型的其他特征(在这种情况下为标题)
将模型附加到所需的任何视图。


请注意,由于模型修改是在将模型附加到视图之前完成的,因此我没有使用model->beginInsertRows(...)model->endInsertRows()。如果在将模型内容附加到任何视图后对其进行修改,则应使用这些调用。否则,请记住,更新模型后,您可能使用的任何索引都可能变得无效。

关于c++ - QTreeView每个条目有2列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51514675/

10-16 04:59