Название: QTableView не обновляет число видимых колонок при изменении в модели Отправлено: xintrea от Июнь 19, 2015, 23:11 Делаю я в своем проекте переход со связки
QTableView-QAbstractTableModel на связку QTableView-QSortFilterProxyModel-QAbstractTableModel то есть, внедряю промежуточную прокси модель. Проблема в том, что раньше, когда у меня был просто класс recordSourceModel (унаследованный от QAbstractTableModel), то при изменении числа видимых колонок в этой модели, вид сразу начинал отображать новые колонки. Для этого нужно было только "передернуть" модель, вот так: Код: setModel(NULL); Теперь, у меня есть класс recordProxyModel (унаследованный от QSortFilterProxyModel). Он сейчас практически пустой - есть только пустые конструктор и деструктор. По идее, он должен тупо ретранслировать все данные recordSourceModel, потому что ему задана эта модель через setSourceModel(recordSourceModel). И recordProxyModel действительно ретранслирует все данные recordSourceModel. И измененное число колонок тоже. Но вид не отображает новое число колонок при их изменении. Не помогает и "передергивание" модели: Код: setModel(NULL); Я даже откатился назад, перепроверил с 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, вид или прокси модель среагирует на этот сигнал пере запросом метрик таблицы. |