QTreeView invisibleRootItem的行数列数的问题

无畏烧风 2022-09-10 18:46:51

背景:楼主想写遍历一个QTreeView的功能函数。代码如下

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QVBoxLayout *vbox = new QVBoxLayout;
    QTreeView *treeView = new QTreeView;
    model = new QStandardItemModel;
    QPushButton *button = new QPushButton(QStringLiteral("遍历树"));
    QPushButton *button1 = new QPushButton(QStringLiteral("验证"));
    QPushButton *button2 = new QPushButton(QStringLiteral("验证1"));
    //QTreeView常用的设置
    treeView->setSelectionMode(QAbstractItemView::SingleSelection);
    treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
    treeView->setAlternatingRowColors(true);
    treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    //设置标题
    model->setHorizontalHeaderLabels(QStringList() << QStringLiteral("年级/班级") << QStringLiteral("姓名") << QStringLiteral("分数") << QStringLiteral("评价"));
    //表头相关的设置
    treeView->header()->setStretchLastSection(true);//最后一列自适应宽度

    //往model里面添加数据
    //一级节点只有 班级列的数据
    for(int i = 0; i < 5; i++)
    {
        QStandardItem *item = new QStandardItem(QStringLiteral("%1年级").arg(i + 1));
        model->appendRow(item);
        for(int j = 0; j < 5; j++)
        {
            QStandardItem *item1_0 = new QStandardItem(QStringLiteral("%1班").arg(j + 1));
            QStandardItem *item1_1 = new QStandardItem(QStringLiteral("Tom"));
            QStandardItem *item1_2 = new QStandardItem(QStringLiteral("100"));
            QStandardItem *item1_3 = new QStandardItem(QStringLiteral("差"));
            item->appendRow(QList<QStandardItem*>() << item1_0 << item1_1 << item1_2 << item1_3);
        }
    }
    treeView->setModel(model);
    vbox->addWidget(treeView);
    vbox->addWidget(button);
    vbox->addWidget(button1);
    vbox->addWidget(button2);
    connect(button, &QPushButton::clicked, this, &Widget::slot_thebutton);
    connect(button1, &QPushButton::clicked, this, &Widget::slot_thebutton1);
    connect(button2, &QPushButton::clicked, this, &Widget::slot_thebutton2);
    setLayout(vbox);
}


void Widget::slot_thebutton()
{
    QStandardItem *rootItem = model->invisibleRootItem();
    qDebug() << "rows is " << rootItem->rowCount() << "columnCount is " << rootItem->columnCount();
    recursionTree(rootItem);
}


void Widget::recursionTree(QStandardItem *rootItem)
{
    if(rootItem->hasChildren())
    {
        for(int i = 0; i < rootItem->rowCount(); i++)
        {
            for(int j = 0; j < rootItem->columnCount(); j++)
            {
                QStandardItem *item = rootItem->child(i, j);
                qDebug() << item->text();
                if(item->hasChildren())
                {
                    recursionTree(item);
                }
            }
        }
    }
}

但是发现这样会导致崩溃根本原因是因为,一级节点虽然只插入了item但是后面通过打印发现一级节点的列数是4列。导致在遍历树时会有 rootItem->child(0, 1)这种出现。但是返回的是空指针。为啥一级节点的列数不为1,因为只插入了一个item。感谢各位大佬提示。

...全文
52 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
Qt

1.4w+

社区成员

Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
帖子事件
创建了帖子
2022-09-10 18:46
社区公告
暂无公告