Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Июнь 19, 2015, 23:11



Название: QTableView не обновляет число видимых колонок при изменении в модели
Отправлено: xintrea от Июнь 19, 2015, 23:11
Делаю я в своем проекте переход со связки

QTableView-QAbstractTableModel

на связку

QTableView-QSortFilterProxyModel-QAbstractTableModel

то есть, внедряю промежуточную прокси модель.

Проблема в том, что раньше, когда у меня был просто класс recordSourceModel (унаследованный от QAbstractTableModel), то при изменении числа видимых колонок в этой модели, вид сразу начинал отображать новые колонки. Для этого нужно было только "передернуть" модель, вот так:

Код:
  setModel(NULL);
  setModel(recordSourceModel);

Теперь, у меня есть класс recordProxyModel (унаследованный от QSortFilterProxyModel). Он сейчас практически пустой - есть только пустые конструктор и деструктор. По идее, он должен тупо ретранслировать все данные recordSourceModel, потому что ему задана эта модель через setSourceModel(recordSourceModel).

И recordProxyModel действительно ретранслирует все данные recordSourceModel. И измененное число колонок тоже.

Но вид не отображает новое число колонок при их изменении. Не помогает и "передергивание" модели:

Код:
  setModel(NULL);
  setModel(recordProxyModel);

Я даже откатился назад, перепроверил с recordSourceModel - изменение числа колонок отображается в виде. Но когда настраиваешь вид на recordProxyModel, то изменение числа колонок на вид никак не влияют.

Что делать, как исправить?


Название: Re: QTableView не обновляет число видимых колонок при изменении в модели
Отправлено: xintrea от Июнь 20, 2015, 01:02
Уточняю, это важно.

У меня данные о видимых столбцах хранятся не в модели, а в конфигурации программы. Модель просто каждый раз в методе data() обращается к объекту конфигурации и узнает, какие данные ей нужно показывать в виде: сколько колонок, и в какой последовательности.

Конфигурация может в любой момент работы программы поменяться (пользователь изменил настройки). Причем, количество колонок может произвольно увеличиться или уменьшиться (от 1 до ~10), и последовательность колонок тоже может поменяться.

Конфигурация ничего не знает, что там показывает вид и модель. И не должна знать. Она считает, что вид всегда показывает то, что прописано в конфигурации. Единственное, что делает конфигурация - в случае изменения настроек отправляет виду сигнал, чтоб тот «перегрузил» модель (поставил в NULL, потом опять ту же модель). А модель при последующих вызовах data() просто выдает данные согласно измененной конфигурации.

И раньше это работало. Почему же сейчас не работает?


Название: Re: QTableView не обновляет число видимых колонок при изменении в модели
Отправлено: sociopath от Июнь 20, 2015, 01:39
Могу посоветовать только перекрыть метод columnCount() у вашей прокси-модели и посмотреть, как будет работать. Потому что по базовую реализацию columnCount в QSortFilterProxyModel я смотрел (не увидел ничего криминального), а тестовый велосипед для проверки мне писать лень.


Название: Re: QTableView не обновляет число видимых колонок при изменении в модели
Отправлено: Old от Июнь 20, 2015, 07:22
Зачем так "передергивать" модель?
Попробуйте сигнал resetModel (beginResetModel/endResetModel) из главной модели, или уже "передергивайте" модель в прокси моделе, а не в виде. Передергивание прокси-модели в виде ничего не даст, потому что для прокси-модели основная модель не изменилась и она переопрашивать количество строк/столбцов не будет.



Название: Re: QTableView не обновляет число видимых колонок при изменении в модели
Отправлено: xintrea от Июнь 20, 2015, 12:38
Цитировать
Попробуйте сигнал resetModel (beginResetModel/endResetModel) из главной модели

Не нашел такого. Имеете в виду сигнал modelReset?

Он приватный у QAbstractItemModel...


Вызывать у главной модели beginResetModel/endResetModel ? Но в какой момент? Модель узнает о том, что сделаны изменения в конфигурации (а следовательно и в самой модели) после того, как конфигурация поменялась. Вот этого я понять не могу. В какой момент в моем случае вызывать beginResetModel/endResetModel?

Просто тупо прописать:

beginResetModel();
endResetModel();

после того как конфигурация поменялась - этого будет достаточно?



Название: Re: QTableView не обновляет число видимых колонок при изменении в модели
Отправлено: Old от Июнь 20, 2015, 12:46
Не нашел такого. Имеете в виду сигнал modelReset?
Да.
Вы поменяли схему таблицы в настройках, значит должны уведомить об этом модель, она в свою очередь должна отправить сигнал modelReset, вид или прокси модель среагирует на этот сигнал пере запросом метрик таблицы.