Russian Qt Forum
Апрель 26, 2024, 00:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView не обновляет число видимых колонок при изменении в модели  (Прочитано 3899 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Июнь 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, то изменение числа колонок на вид никак не влияют.

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

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Июнь 20, 2015, 01:02 »

Уточняю, это важно.

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

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

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

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

Собираю информацию по крупицам
http://webhamster.ru
sociopath
Гость
« Ответ #2 : Июнь 20, 2015, 01:39 »

Могу посоветовать только перекрыть метод columnCount() у вашей прокси-модели и посмотреть, как будет работать. Потому что по базовую реализацию columnCount в QSortFilterProxyModel я смотрел (не увидел ничего криминального), а тестовый велосипед для проверки мне писать лень.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Июнь 20, 2015, 07:22 »

Зачем так "передергивать" модель?
Попробуйте сигнал resetModel (beginResetModel/endResetModel) из главной модели, или уже "передергивайте" модель в прокси моделе, а не в виде. Передергивание прокси-модели в виде ничего не даст, потому что для прокси-модели основная модель не изменилась и она переопрашивать количество строк/столбцов не будет.

« Последнее редактирование: Июнь 20, 2015, 07:28 от Old » Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Июнь 20, 2015, 12:38 »

Цитировать
Попробуйте сигнал resetModel (beginResetModel/endResetModel) из главной модели

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

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


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

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

beginResetModel();
endResetModel();

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

« Последнее редактирование: Июнь 20, 2015, 12:46 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Июнь 20, 2015, 12:46 »

Не нашел такого. Имеете в виду сигнал modelReset?
Да.
Вы поменяли схему таблицы в настройках, значит должны уведомить об этом модель, она в свою очередь должна отправить сигнал modelReset, вид или прокси модель среагирует на этот сигнал пере запросом метрик таблицы.
« Последнее редактирование: Июнь 20, 2015, 12:54 от Old » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 22.