Qt:在treeView中设置列

 Lcy榆 发布于 2023-01-29 20:58

我如何为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 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 map = m_reader.getMapFromEntry(i);
    for (const auto & j : map) {
        QList 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在第1列.

希望这可以帮助!

2 个回答
  • 要支持多列,模型必须包含多列的数据.所以在某种意义上,列是模型的属性,而不是视图.然后视图可以决定隐藏或重新排列某些列(例如,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在层次结构的所有级别上都需要相同数量的列,因此如果需要,应该为未使用的列填充空项.

    2023-01-29 20:59 回答
  • 这只是Frank Osterfeld的回答:

    QTreeView显示插入顶级QStandardItems的所有子列列.您只需通过将虚拟QStandardItem插入顶级表来"强制"它以显示其他列.例:

    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,则两个子项都将可见.

    2023-01-29 21:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有