Вопрос: QTableView сохраняет выбор после обновления модели


Я попытался создать пользовательский интерфейс, который отображает содержимое таблицы, в то время как данные обновляются каждую секунду.

Поэтому у меня есть цепочка моделей:

  • QSqlTableModel - доступ к содержимому таблиц
  • MyModel - унаследован от QIdentityProxyModel для небольшого изменения данных (источником является TableModel)
  • SomeFilterModels - которые имеют MyModel как источник

Эта цепочка заканчивается QTableView, Поскольку QSqlTableModel обновляется каждую секунду, любой выбор в TableView также удаляется каждую секунду. Теперь у меня было две идеи, чтобы исправить это.

  1. Предотвратите обнаружение изменений в TableModel. Что плохо работает.
  2. Захват некоторых событий, которые были запущены до и после того, как модель собирается изменить, чтобы сохранить и восстановить текущий выбор. К сожалению, QIdentityProxyModel не передает сигналы типа modelAboutToBeReset или modelReset или dataChanged. Также невозможно повторно использовать эти сигналы из MyModel, поскольку они являются частными.

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

Может ли кто-нибудь дать мне несколько советов?

Заранее спасибо.

Возможно, стоит отметить:

  • Один QSqlTableModel используется для многих TableView. (С другой цепочкой FilterProxyModel.) Поэтому я не могу просто прекратить обновление, потому что один вид имеет выбор.
  • Вы можете подумать, что я знаю, когда я вызываю метод обновления моделей. Но на данный момент это немного сложно пропустить эту корытовую архитектуру. Я имею в виду, что модель обновлена, и TableView уже подключен к обновленной модели через некоторые ProxyModels. Не должно быть необходимости в другом способе общения.

Надеюсь, мой вопрос имеет смысл.


4


источник


Ответы:


QAbstractItemModel включает в себя ряд сигналов, которые могут помочь вам узнать, когда данные в модели будут или будут меняться. В частности, он имеет следующие сигналы:

  • dataChanged
  • headerDataChanged
  • modelAboutToBeReset
  • modelReset
  • columnsAboutToBeInserted
  • columnsAboutToBeMoved
  • columnsAboutToBeRemoved
  • columnsInserted
  • columnsMoved
  • columnsRemoved
  • rowsAboutToBeInserted
  • rowsAboutToBeMoved
  • rowsAboutToBeRemoved
  • rowsInserted
  • rowsMoved
  • rowsRemoved

Учитывая, что вы теряете выделение, я полагаю, что выделенные жирным шрифтом сигналы - это те, с которыми вы хотите столкнуться, потому что поведение по умолчанию Qt заключается в сохранении выбора, если они могут там, где столбцы или строки удалены / вставлены, и это не влияет выбор.

Как только вы подключены к этим сигналам, в modelAboutToBeReset Я предлагаю получить идентификаторы для ячеек, которые вы можете повторно использовать, чтобы выбрать их снова, и в modelReset затем используя эти идентификаторы, чтобы получить QModelIndexs и использовать их для повторного выбора одних и тех же ячеек.


1