2013-06-28 5 views
2

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

Вот упрощенная версия моего кода:

QStringListModel *model = new QStringListModel; 
QListView *view = new QListView; 

view->setModel(model); 

QStringList list; 
list << "a" << "b" << "c"; 

model->setStringList(list); 
model->stringList() << "d"; 

Проблема, на мой взгляд только содержит а, Ь и с. Но нет. Зачем? Я думал, что представление будет автоматически обновляться после изменения модели, но, похоже, это не так. У тебя есть идея?

ответ

2

Проблема в последней строке. model->stringList() возвращает экземплярQStringList, используемый в качестве модели, поэтому вы изменяете только копию, используемая для модели, остается неизменной.

использовать что-то вроде этого:

QStringList list = model->stringList(); 
list << "d"; 
model->setStringList(list); 

Это будет работать, хотя setStringList() вызовет полный, потенциально дорогостоящий сброс модели. Тем не менее, похоже, что это не так с QStringListModel.

+0

Спасибо, это работает. Но, как вы сказали, он не оптимизирован из-за полного сброса модели. Разве нет лучшей альтернативы? –

+0

Лучшей альтернативой является не использование QStringList, а создание собственного подкласса QAbstractListModel. Там вы можете использовать beginInsertRows() и endInsertRows() для добавления новых элементов без полного сброса модели. –

+1

Вы также можете использовать 'QStandardItemModel'. Это просто и достаточно эффективно. –