每个条目有 2 列的 QTreeView
QTreeView with 2 columns for each entry
我想创建一个包含 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 的第二列中。我敢肯定,原因是模型的第二列与根项的第二列不同。
但是如何解决这个问题呢?
我找到了解决问题的方法。现在我正在向模型添加第二个项目,它显示值。
这意味着,首先您必须创建一个包含您想要的列的模型。
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);
最后将模型附加到 treeView
ui->treeView->setModel(model);
现在你准备好了。我认为这不是最好的解决方案。如果您知道更好的请告诉我们。
您无需指定行数或列数,只需专注于向模型添加元素,它会关心内部细节。
在这个最小的示例中,创建了一个模型,其中填充了三个 parent(外部循环),每个模型有 3、2 和 1 个 children(内部循环)。也就是说,该模型总共有 (1 + 3) + (1 + 2) + (1 + 1) = 9 行,每行两列 children(名称和数据),但是只有一个用于 parents(只有名称,请注意添加的 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
) 的列表,您将该行附加到其 parent 项(如果它们是第一级元素,则附加到根项)。
- 设置模型的附加特征(在本例中为headers)
- 将模型附加到任何需要的视图。
请注意,我没有使用 model->beginInsertRows(...)
和 model->endInsertRows()
,因为模型修改是在将模型附加到视图之前完成的。如果在将模型内容附加到任何视图后修改模型内容,则应该使用这些调用。否则,请记住,您可能正在使用的任何索引在模型更新后都可能失效。
我想创建一个包含 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 的第二列中。我敢肯定,原因是模型的第二列与根项的第二列不同。
但是如何解决这个问题呢?
我找到了解决问题的方法。现在我正在向模型添加第二个项目,它显示值。
这意味着,首先您必须创建一个包含您想要的列的模型。
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);
最后将模型附加到 treeView
ui->treeView->setModel(model);
现在你准备好了。我认为这不是最好的解决方案。如果您知道更好的请告诉我们。
您无需指定行数或列数,只需专注于向模型添加元素,它会关心内部细节。
在这个最小的示例中,创建了一个模型,其中填充了三个 parent(外部循环),每个模型有 3、2 和 1 个 children(内部循环)。也就是说,该模型总共有 (1 + 3) + (1 + 2) + (1 + 1) = 9 行,每行两列 children(名称和数据),但是只有一个用于 parents(只有名称,请注意添加的 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
) 的列表,您将该行附加到其 parent 项(如果它们是第一级元素,则附加到根项)。 - 设置模型的附加特征(在本例中为headers)
- 将模型附加到任何需要的视图。
请注意,我没有使用 model->beginInsertRows(...)
和 model->endInsertRows()
,因为模型修改是在将模型附加到视图之前完成的。如果在将模型内容附加到任何视图后修改模型内容,则应该使用这些调用。否则,请记住,您可能正在使用的任何索引在模型更新后都可能失效。