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

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

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

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

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

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

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

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

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

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

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

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

4

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]