2009-12-08 5 views
2

У меня возник вопрос об уведомлении модели изменений, внесенных в какой-либо другой объект, в котором хранится ссылка.Уведомляющий подкласс QAbstractItemModel об изменениях

Я знаю сигнал dataChanged(), но я не уверен, как его использовать. Например, моя модель хранит ссылку на какой-то другой объект (назовем его myObjPtr). Модель запрашивает myObjPtr для ее содержимого только тогда, когда на модели вызываются методы rowCount(), columnCount(), data() и другие.

Затем, если я вношу некоторые изменения в содержимое myObjPtr, как я должен уведомить модель, чтобы она могла испускать сигнал dataChanged() с правильными аргументами? Должен ли я использовать метод setData() модели? Какие аргументы я должен передать, если я, например, удалил или заменил некоторые элементы в myObjPtr?

спасибо.

ответ

3

Если я понимаю, о чем вы просите, то самым простым способом является для myObjPtr сигнал, который он испускает, когда он изменен, и испускает сигнал dataChanged() в модели. Имейте в виду, что сигнал dataChanged() специфичен в отношении того, какие данные были изменены. Если вы не можете получить такую ​​степень точности, вы также можете вызвать reset() в модели, что приведет к обновлению всей информации.

+0

Благодарим за подсказку по методу reset(). Не могли бы вы более подробно объяснить случай с dataChanged()? Я спросил в исходном сообщении о том, какие аргументы должны быть переданы в dataChanged(), когда я удаляю/добавляю/заменяю элементы в myObjPtr (myObjPtr фактически имеет древовидную структуру). Должен ли я создавать новые экземпляры QModelIndex для таких элементов, которые будут использоваться в вызове 'emit dataChanged (topLeft, bottomRight);'? –

+2

Если myObjPtr может предоставить достаточно информации о том, что изменилось, используйте сигнал dataChanged. Да, для этого нужно создать новые экземпляры QModelIndex. Обязательно создайте их с помощью методов модели или установите родительский элемент для индексов правильно, чтобы Qt точно знал, какие элементы модели были изменены. –