Извлечение всех данных из определенного столбца во вложенной 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
}
}
}
}