从嵌套的QStandardItemModel中的特定列中提取所有数据

时间:2018-03-16 14:26:07

标签: c++ qt qstandarditemmodel

我有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。 我相信循环本身终止于根节点,导致只有第一个值。是否可以递归地从嵌套模型中的特定列中提取所有项目?

1 个答案:

答案 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
            }
        }
    }
}