Извлечение всех данных из определенного столбца во вложенной QStandardItemModel

У меня есть QStandardItemModel который я прохожу через вид, чтобы отобразить его внутри QTreeView, Моя модель содержит 2 столбца, работающих как пары ключ и значение. Первый столбец содержит шаблон исправления ключей, а второй столбец содержит их соответствующие значения. Мое примерное дерево выглядит примерно так:

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 ответ

Я пишу это из головы, так что вам, возможно, придется немного подправить, но это должно сработать. Вам нужно обратиться к элементам более низкого уровня с родительскими индексами.

Но я не уверен, что ваша модель верна, потому что код, который вы предоставили, не должен печатать '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
            }
        }
    }
}
Другие вопросы по тегам