Каковы возможные причины для `emit dataChanged (...);`, чтобы не запускать обновление отображения представления? - PullRequest
1 голос
/ 31 октября 2011

Я реализую свою третью "наивную" модель как наследующий класс QAbstractItemModel.

Пока все работает хорошо. Однако в своих представлениях я использовал «статические» модели, доступные только для чтения, и менял модель некоторых представлений только в зависимости от действий пользователя. Поэтому я использовал my_view->setModel( a_model ); для обновления представления.

Теперь мне нужно иметь одно из представлений, чтобы сохранить уникальную модель, но эту модель нужно иногда обновлять, используя специальную функцию «update ()», которую я вызываю в коде, когда это необходимо.

В конце функции update () я просто вызываю emit dataChanged( ... ); с соответствующими данными.

Кажется, он не обновляет представление, к которому подключена эта модель. Кажется, что единственный способ сделать обновление представления - это сделать что-то вроде my_view->setModel( nullptr );, а затем my_view->setModel( a_model );.

Каковы возможные причины для emit dataChanged( ... ); не запускать обновление отображения представления?

Я отлаживал свои функции реализации модели и вызывал функцию index (), но не data (). Я немного обеспокоен тем, что, возможно, я что-то не понял в системе модель / представление в случае изменения модели (это изменяется не через представление, а программно).

Это проект с открытым исходным кодом, так что вы можете проверить полный код модели (я думаю, это немного странно, не используется для моделирования / просмотра системы Qt): http://code.google.com/p/art-of-sequence/source/browse/tools/aosdesigner/view/model/LayerObjectsModel.cpp?spec=svn4fe209aa3e82f2c7cd42192581a890e28bada9b0&r=4fe209aa3e82f2c7cd42192581a890e28bada9b0 Код виджета, управляющего представлением, доступен там: http://code.google.com/p/art-of-sequence/source/browse/tools/aosdesigner/view/LayersView.cpp?spec=svn4fe209aa3e82f2c7cd42192581a890e28bada9b0&r=4fe209aa3e82f2c7cd42192581a890e28bada9b0

1 Ответ

4 голосов
/ 31 октября 2011

Я немного проверил документацию по Qt.dataChanged() должно генерироваться при изменении существующих данных модели.

Если вы добавляете строки в модель, проверьте beginInsertRows и endInsertRows

Из документации insertRows Qt:

Если вы реализуете свою собственную модель, вы можете переопределить эту функцию, если хотите поддерживать вставки.Кроме того, вы можете предоставить свой собственный API для изменения данных.В любом случае вам нужно будет вызвать beginInsertRows () и endInsertRows (), чтобы уведомить другие компоненты об изменении модели.

Если вы удаляете строки из проверки модели, соответственно beginRemoveRows и endRemoveRows

Также взгляните на beginResetData

Когда модель радикально меняет свои данные, иногда бывает прощепросто вызывайте эту функцию, а не вызывайте dataChanged (), чтобы сообщить другим компонентам об изменении базового источника данных или его структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...