【问题标题】:QTreeView with 2 columns for each entryQTreeView,每个条目有 2 列
【发布时间】:2018-07-25 08:50:12
【问题描述】:

我想创建一个有 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 的第二列中。我敢肯定,原因是模型的第二列与根项的第二列不同。

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

【问题讨论】:

  • 如何将项目附加到模型中,可以显示代码吗?
  • 我忘记发布代码了。这里是:model->appendRow(root);

标签: c++ qt qtreeview qstandarditemmodel qstandarditem


【解决方案1】:

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

在这个最小示例中,创建了一个模型,其中填充了三个父级(外部循环),每个子级有 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);

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

  1. 创建模型
  2. 逐行填充模型。每行都是QStandardItem 元素的列表 (rowItems),您可以将该行附加到其父项(如果它们是第一级元素,则附加到根项)。
  3. 设置模型的其他特征(在本例中为标题)
  4. 将模型附加到所需的任何视图。

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

【讨论】:

  • 嗨,JC Gonzalez,您所做的与我所做的几乎相同。你的意思是区别在哪里。也许我什么都没看到。
  • 嗨。我向您展示了一个完整的工作示例,我在您添加答案之前准备了该示例。该示例与您的最终解决方案相似,但与您最初的问题完全不同。无论如何,有些东西是新的;最重要的是我不关心模型将有多少行或列,你不需要它,它可以在内部计算。另一个是添加标题,或使用 begin/endInsertRows() 的建议。我希望它有所帮助。
  • 啊好吧,没关系。谢谢你的回答。
【解决方案2】:

我找到了解决问题的方法。现在我要向模型中添加第二个项目,它会显示值。

这意味着,首先你必须创建一个包含你想要的这么多列的模型。

QStandardItemModel *model = new QStandardItemModel(0,2); 

在第二步中,您必须为一行的每个单元格创建一个项目。

QStandardItem *itemColumn1 = new QStandardItem();
itemColumn1->setText("name");

QStandardItem *itemColumn2 = new QStandardItem();
itemColumn2->setText("value");

之后你必须和他们一起创建一个列表。

QList<QStandardItem*> list = QList<QStandardItem*>();
list.append(itemColumn1);
list.append(itemColumn2);

现在您可以将此列表附加到父项。

QStandardItem *root = new QStandardItem();
root->appendRow(list);

然后将根项附加到模型中

model->appendRow(root);

最后将模型附加到树视图

ui->treeView->setModel(model);

现在你准备好了。我认为这不是最好的解决方案。如果你知道更好的,请告诉我们。

【讨论】:

  • 很高兴听到,您在我回答您时找到了解决方案...请务必检查一下,以防万一,您可能会发现有用的信息。
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 2018-05-24
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多