16,818
社区成员




背景:楼主想写遍历一个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。感谢各位大佬提示。