Удаление QStandardItems из QStandardItemModel

Я пытаюсь удалить QStandardItems из QStandrditemModel, используя QPersistentIndex. Элементы успешно удалены, но при повторении модели удаленные строки появляются без каких-либо данных.

Я использую следующий код для удаления элементов:

QList<QPersistentModelIndex> selectedIndexes;

foreach (const QModelIndex &modelIndex, this->selectionModel()->selectedIndexes())
{
    selectedIndexes << modelIndex;
}

foreach (const QPersistentModelIndex &index, selectedIndexes)
{
    QPersistentModelIndex parentIndex = index.parent();   
    model->removeRow(index.row(),parentIndex); 
}

// In another function
foreach (const QModelIndex &index, this->selectionModel()->selectedIndexes())
{ // do soemthing and the items appear without any data as shown
  // in the image below
}

Снимок экрана


person user1703942    schedule 15.04.2014    source источник
comment
model == this?   -  person Dmitry Sazonov    schedule 15.04.2014
comment
Моя ошибка... Ваш код выполняется одним методом? Есть ли реальные причины использовать QPersistentModelIndex вместо QModelIndex? Что вы делаете в третьем цикле?   -  person Dmitry Sazonov    schedule 15.04.2014
comment
Я использовал QPersistentModelIndex, потому что, когда я пытаюсь удалить несколько элементов, QModelIndex изменяется при удалении первого элемента. поэтому я использовал индекс QPersistentModel. Третий цикл находится не в той же функции, а в другой функции. В этом цикле я снова выбираю индексы и выполняю операции, например. Редактирование выбранных элементов показывает странное поведение, как показано на снимке экрана.   -  person user1703942    schedule 16.04.2014
comment
На самом деле я не нашел решения. но я обнаружил еще одно странное поведение, когда я пытаюсь установить интерфейс с некоторыми компонентами пользовательского интерфейса, затем для одного поля со списком, если я изменю его индекс или прокомментирую (//) эту строку. Тогда я не получаю пустые элементы в дереве при выполнении третьего цикла. Я знаю, что это не имеет никакого смысла. Но вот как это работает. Я не знаю, почему.   -  person user1703942    schedule 16.04.2014
comment
Почему вы не удаляете QStandardItem? Создайте список элементов QList<QStandardItem *> и вызовите qDeleteAll.   -  person Dmitry Sazonov    schedule 16.04.2014
comment
Это старый вопрос, но у меня та же проблема с пустыми строками, оставшимися в модели. На самом деле я получаю список элементов и использую qDeleteAll и получаю именно тот эффект, который описан. Я использую Qt 5.6 и не могу обновиться.   -  person goug    schedule 12.06.2019


Ответы (1)


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

    QList <QStandardItem *> items = ...some list of items to remove...

    for (int i = 0; i < items.count (); i++)
    {
        QStandardItem *parent = items[i]->parent ();

        if (parent)
        {
            QList <QStandardItem *> row_items = parent->takeRow (items[i]->row ());
            qDeleteAll (row_items);
        }
    }

Использование «takeChild» не сработало, как и любой другой механизм, который я пробовал. Не копаясь в коде Qt, кажется, что происходит то, что удаление одного элемента не удаляет строку, содержащую этот элемент, даже если это единственный элемент в строке.

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

person goug    schedule 12.06.2019