2013-03-22 4 views
2

В QAbstractItemModel некоторые функции, такие как beginInsertRows, beginRemoveRows, могут использоваться для вставки и удаления строк. Но как реализовать замену элемента строки другим?Как заменить строку в QAbstractItemModel?

+1

Кажется, что замена - это просто удаление, за которым следует вставка. – Chris

+0

Этот способ работает, но я думаю, что должен быть лучший способ. – user1899020

+2

также удалять + вставка, конечно, потеряет выделение и расширенное состояние (для дерева) – barjak

ответ

1

Если я правильно Вас понял, что вам нужно уведомить subcribed взгляды на изменения данных (одна строка заменяется на новый, для представлений это означает, что данные были изменены) для указанного индекса модели:

// let's the row is index that we want to invalidate 
QVector<int> roles; 
roles << Qt::DisplayRole; 
emit dataChanged(index(row, 0), index(row, columnCount()-1), roles); 
+0

Я пробовал, но иногда это не работает правильно. В настоящее время я выдаю сигнал 'layoutChanged()'. Это работает, но мне интересно, дорого ли это. – user1899020

+0

Можете ли вы объяснить, что не работает? – AnatolyS

+0

У меня есть родительский узел. Я меняю его на другой родительский узел с разными детьми. А затем испустите сигнал dataChanged с первым индексом в качестве родителя и последним индексом в качестве последнего дочернего элемента родителя. Я также пытаюсь установить первый и последний индексы такими же, как и родительский. Оба не работают. Благодарю. – user1899020

0

Если вы хотите изменить много данных, вы должны сделать что-то вроде этого:

beginResetModel(); 
// change data 
endResetModel(); 

Если изменить только одну строку, испуская dataChanged() следует сделать трюк.

Смежные вопросы