2014-02-06 6 views
4

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

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

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

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

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

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

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

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

Может стоит отметить:

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

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

+0

Мое первое замечание состояло в том, чтобы обновлять только изменения в вашей модели, но поскольку вы используете модель SQL, я сомневаюсь, что вы можете получить такую ​​заметную видимость изменений. Есть ли какой-нибудь идентификатор, который вы можете получить из выбранных данных, чтобы узнать, какие элементы выбраны, а затем найти индексы модели, когда модель обновится? –

+0

@ CalebHuitt-cjhuitt Я могу получить эти идентификаторы, но я не знаю, когда модель обновится, чтобы я мог получить выбор. – r2p2

ответ

1

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

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

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

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

+0

К сожалению, это не работает, потому что QIdentityProxyModel не передает эти сигналы. – r2p2

Смежные вопросы