繁体   English   中英

Qt:在treeView中设置列

[英]Qt: set columns in treeView

如何为qTreeView的qTreeWidget实现此代码?

for (const auto & i : names) {
    QTreeWidgetItem * item = new QTreeWidgetItem(ui->treeWidget);
    item->setText(0, QString::fromStdString(i));
    ui->treeWidget->addTopLevelItem(item);
    const std::unordered_map<std::string, double> map = m_reader.getMapFromEntry(i);
    for (const auto & j : map) {
        QTreeWidgetItem * item2 = new QTreeWidgetItem();
        item2->setText(0,QString::fromStdString(j.first));
        item2->setText(1,QString::number(j.second));
        item->addChild(item2);
    }

}

我有一个模型和一个treeView,如下所示:

m_model = new QStandardItemModel(m_reader.getAllNames().size(),2,this);
ui->treeView->setModel(m_model);

我试过了,但是只显示一列:

QStandardItem * parentItem = m_model->invisibleRootItem();
for (const auto & i : names) {
    QStandardItem * item = new QStandardItem(QString::fromStdString(i));
    parentItem->appendRow(item);
    const std::unordered_map<std::string, double> map = m_reader.getMapFromEntry(i);
    for (const auto & j : map) {
        QList<QStandardItem *> rowItems;
        rowItems << new QStandardItem(QString::fromStdString(j.first));
        rowItems << new QStandardItem(QString::number(j.second));
        item->appendRow(rowItems);
    }
}

有了treeWidget,我就这样设置了columnCount,如下所示:

ui->treeWidget->setColumnCount(2);

但是treeView没有这样的方法。

因此,总结一下: 如何实现一个多列的TreeView?

编辑:
为了澄清,我想要这样的事情:

| -A
| | -BC
| | -DE

其中A是父母,B,C,D,E是孩子,B,D在第0列,C,E在第1列。

希望这可以帮助!

要支持多列,模型必须包含多列的数据。 因此从某种意义上说,列是模型的属性,而不是视图的属性。 然后,视图可以决定隐藏或重新排列某些列(例如,QListView始终仅显示第一列,而一个人可以隐藏或重新排列QTableView中的列)。

使用QStandardItemModel时,其文档应提供一些有关如何创建多个列的提示。

例如,从文档中查看以下示例:

 QStandardItemModel model(4, 4);
 for (int row = 0; row < 4; ++row) {
     for (int column = 0; column < 4; ++column) {
         QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
         model.setItem(row, column, item);
     }
 }

它创建一个具有4个初始行和列的模型,然后通过setItem()将其填充项目。

或者,您可以将项目列表传递给QStandardItemModel :: appendRow() ,并为每列提供一个项目:

QList<QStandardItem*> items;
items.append(new QStandardItem(tr("One"));
items.append(new QStandardItem(tr("Two"));
model->appendRow(items);

这将添加一个新行,第一列为“ One”,第二列为“ Two”。有关处理多列的更多方法,请参见QStandardItemModel文档。

注意 :QTreeView在层次结构的所有级别上期望的列数相同,因此,如果需要,应在行中填充未使用的列的空项目。

弗兰克·奥斯特费尔德(Frank Osterfeld)的回答只是补充:

QTreeView显示插入到顶级QStandardItems中的子表的所有列。 您只需通过将虚拟QStandardItems插入顶级表中来“强制”它以显示其他列。 例:

QStandardItemModel *objectTreeModel = new QStandardItemModel(NULL);
QStandardItem *mainItem = new QStandardItem(tr("Main Item"));
QStandardItem *subItem1 = new QStandardItem(tr("Sub-Item 1"));
QStandardItem *subItem2 = new QStandardItem(tr("Sub-Item 2"));
mainItem->appendRow(QList<QStandardItem *>() << subItem1 << subItem2);

QStandardItem *dummyItem = new QStandardItem();

objectTreeModel->appendRow(QList<QStandardItem *>() << mainItem << dummyItem );

现在,您将能够看到2列,并且如果展开mainItem,两个子项目都将可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM