Вопрос:

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

qt delete-row qstandarditemmodel qstandarditem

267 просмотра

1 ответ

62 Репутация автора

Я пытаюсь удалить 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
}

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

Автор: user1703942 Источник Размещён: 15.04.2014 08:55

Ответы (1)


0 плюса

1332 Репутация автора

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

    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, похоже, происходит то, что удаление одного элемента не приводит к удалению строки, содержащей этот элемент, даже если это единственный элемент в строке.

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

Автор: goug Размещён: 12.06.2019 09:19
32x32