我有QStandardItemModel
我正在通过视图将其显示在QTreeView
内。我的模型包含2个像Key和Value对一样工作的列。第一列包含Keys的修复模板,第二列包含其对应的值。我的示例树看起来像这样:
Item | Attributes
Name Tomato
|-Type Fruit
|-Color Red
Name ...
|-Type ...
正如我所说,我在第一列的模板保持不变,但第二列中的值是来自用户的输入。
我想要什么:
我想遍历(递归)遍历模型,抓取Attributes
列中的所有值并将其写入文件
到目前为止我做了什么:
void Writer::writeToYaml(const std::shared_ptr<QStandardItemModel>& model,
const QString& filePath)
{
for(int r = 0; r < model->rowCount(); ++r)
{
QModelIndex index = model->index(r, 1);
QVariant data = model->data(index);
qDebug() << data;
if(model->hasChildren(index))
{
writeToYaml(model, filePath);
}
}
}
当我运行我的代码时,qDebug()
始终只输出Tomato
。
我相信循环本身终止于根节点,导致只有第一个值。是否可以递归地从嵌套模型中的特定列中提取所有项目?
答案 0 :(得分:0)
我是从头顶写的,所以你可能需要调整一下,但它应该有效。您需要使用父索引处理较低级别的项目。
但是我不确定你的模型是否正确,因为你提供的代码不应该打印'tomato',但是应该创建一个无限循环,因为一旦你递归调用writeToYaml
,你就会迭代顶层物品又来了。这意味着model->hasChildren(index)
很可能在你的情况下永远不会......
void Writer::writeToYaml(const std::shared_ptr<QAbstractItemModel>& model, const QString& filePath)
{
std::stack<QModelIndex> indices;
for (int = model->rowCount() - 1; r >= 0; --r) // iterate from last to first as you put items on a stack
{
indices.push(model->index(r, 1));
}
while (!indices.empty())
{
auto index = indices.top();
indices.pop();
QVariant data = model->data(index);
qDebug() << data;
if (model->hasChildren(index))
{
for (int r = model->rowCount(index) -1 ; r >= 0; --r)
// ^^^^^ note this, this iterates over all children of item on given index
{
indices.push(model->index(r, 1, index));
// ^^^^^ this is the parent index that identifies the item in tree hierarchy
}
}
}
}