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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Невозможно обновить QTreeView из внешнего кода...  (Прочитано 9728 раз)
Cyrax
Гость
« : Января 12, 2008, 19:16 »

Каким образом можно инициировать процесс обновления QTreeView из внешнего кода, т.е. не из представления и не из модели, связанной с представлением ?

У меня такая схема объектов:
1. Общий класс с общими данными Manager
2. Модель M1 (наследник QAbstractTableModel), извлекающая данные из класса Manager, и представление V1, отображающее данные этой модели.
3. Модель M2, извлекающая данные из класса Manager, и представление V2, отображающее данные этой модели.

При нажатии на форме кнопки добавления строки в M1/V1 я добавляю новые данные (инициализированные по умолчанию) в Manager. Далее мне нужно сделать так, чтобы представление V1 обновило все свои данные, начиная с количества строк. Либо сделать так, чтобы модель M1 инициировала этот процесс у V1. Инициировать такой процесс нужно из внешнего (по отношению к M1 и V1) кода - кода формы.

Поскольку модель M1 (наследник QAbstractTableModel) имеет protected-метод reset(), то инициировать процесс обновления представления можно было бы, вызвав некоторый public-слот PS модели M1, который бы вызвал метод reset(). Но при соединении сигнала clicked() кнопки добавления строки с public-слотом PS модели M1 из кода формы (на которой расположена эта кнопка) слот PS почему-то не вызывается...

Модель M1 имеет public-метод insertRow(). Но эффекта он абсолютно никакого не приносит. Поиск "говорит", что нужно операции вставки row'ов окаймить строками beginInsertRows() и endInsertRows(). Но эти методы - protected. Опять та же проблема.

Переустановка модели в представлении опять никакого эффекта не приносит...

Вывод: невозможно обновить QTreeView из внешнего кода...
Причём все примеры троллей, касающиеся вставки, основаны на widget'ах, а не на моделях и представлениях.

з.ы. Оказывается в Qt4 возможно 3 часа безуспешно мыкаться с элементарной операцией вставки строк. Ужас.
Записан
ритт
Гость
« Ответ #1 : Января 12, 2008, 22:19 »

Цитировать
void QAbstractItemView::reset ()   [virtual slot]
Reset the internal state of the view.

beginInsertRows() и endInsertRows() желательно звать непосредственно из insertRow() /* до и после добавления строк{и,} */ чтобы дать вьюхе знать о произошедших изменениях
Записан
Cyrax
Гость
« Ответ #2 : Января 12, 2008, 22:24 »

Вопрос попроще: с чем связать сигнал clicked() кнопки добавления ?
Кнопка расположена на форме, на которой находится QTableView ?
Записан
Cyrax
Гость
« Ответ #3 : Января 13, 2008, 22:02 »

Блин, ну что за херня. Для обновления ячеек представления (после изменения количества рядов) вызываю метод reset() модели. В результате у представления сбрасываются настройки ресайза рядов и столбцов. Ужас. Работать невозможно.
Неужели невозможно из модели "заставить" представление обновить содержимое своих ячеек + число столбцов, чтобы при этом оно не сбрасывло никакие свои параметры ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Января 14, 2008, 17:47 »

что то я не понял проблемы...
Разве после вставки данных в модель, QTreeView не обновляет свое содержимое???
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Cyrax
Гость
« Ответ #5 : Января 14, 2008, 20:00 »

Цитировать
Разве после вставки данных в модель, QTreeView не обновляет свое содержимое???
Не обновляет. Потому что данные я добавляю в объект класса Manager (модель извлекает данные из этого объекта).

Фрагмент из 1 поста:
Цитировать
У меня такая схема объектов:
1. Общий класс с общими данными Manager
2. Модель M1 (наследник QAbstractTableModel), извлекающая данные из класса Manager, и представление V1, отображающее данные этой модели.
3. Модель M2, извлекающая данные из класса Manager, и представление V2, отображающее данные этой модели.

При нажатии на форме кнопки добавления строки в M1/V1 я добавляю новые данные (инициализированные по умолчанию) в Manager. Далее мне нужно сделать так, чтобы представление V1 обновило все свои данные, начиная с количества строк. Либо сделать так, чтобы модель M1 инициировала этот процесс у V1. Инициировать такой процесс нужно из внешнего (по отношению к M1 и V1) кода - кода формы.

А изменяю я из внешнего кода не только ряды (в терминах модели/представления, в Manager всё это имеет более сложную структуру), но и заголовки, их структуру. Мне всего лишь нужно обновить все данные представления, включая количество строк и столбцов и не сбрасывая настройки представления (ресайз и т.п.)...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Января 14, 2008, 20:19 »

А каким образом модель получает данные из Manager?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Cyrax
Гость
« Ответ #7 : Января 14, 2008, 20:29 »

Цитировать
А каким образом модель получает данные из Manager
Указатель на Manager передаю в конструктор модели.
Если возникают вопросы, почему я выбрал именно такую организацию данных, можно глянуть сюда: http://prog.org.ru/forum/index.php/topic,6704.0.html

Текущий вопрос:
Как обновить все данные представления, начиная с количества строк и столбцов и не сбрасывая настройки представления (ресайз и т.п.) ?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Января 14, 2008, 22:21 »

может это сделать:
void QAbstractItemModel::layoutChanged () ?
из прокси-модели?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Cyrax
Гость
« Ответ #9 : Января 14, 2008, 22:24 »

Цитировать
void QAbstractItemModel::layoutChanged () ?
И представление обновит свои данные ?
И почему именно прокси ?  У меня сейчас нет прокси-моделей.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Января 14, 2008, 23:25 »

Под прокси имеется в виду это.

2. Модель M1 (наследник QAbstractTableModel), извлекающая данные из класса Manager, и представление V1, отображающее данные этой модели.
3. Модель M2, извлекающая данные из класса Manager, и представление V2, отображающее данные этой модели.


А это из ассистента:

надо вызвать emit layoutAboutToBeChanged() до изменения данных
и emit layoutChanged () после...

This signal is emitted whenever the layout of items exposed by the model has changed; for example, when the model has been sorted. When this signal is received by a view, it should update the layout of items to reflect this change.
When subclassing QAbstractItemModel or QAbstractProxyModel, ensure that you emit layoutAboutToBeChanged() before changing the order of items or altering the structure of the data you expose to views, and emit layoutChanged() after changing the layout.
Subclasses should update any persistent model indexes before emitting layoutChanged().
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Tonal
Гость
« Ответ #11 : Января 15, 2008, 08:38 »

У нас изменение данных реализовано примерно следующим образом:
1) Менеджер посылает всем сигнал "начало изменений"
На этот сигнал обычно идёт заморозка интерфейса и. т.п.
2) Менеджер посылает сигналы о том, что добавились/удалились/изменились некоторые объекты (список овъектов идёт с сигналом).
На это модели делают begin(Insert/Delete), end(Insert/Delete)...
3) Менеджер посылает всем сигнал "окончено изменение"
На это интерфейсы размораживаются.

В реальности несколько сложнее. Но суть такая.
Записан
Cyrax
Гость
« Ответ #12 : Января 15, 2008, 09:22 »

Tonal, изменение данных происходит непосредственно в Manager'е или в моделях (которые работают с менеджером) ?
Записан
Tonal
Гость
« Ответ #13 : Января 15, 2008, 10:56 »

Изменения данных - в Manager'е
У нас модели хранят списки ссылок на данные.
По сигналу о добавлении/удалении/изменении изменяется состав этих списков.

В принципе можно обойтись без списков в моделях, если Manager предоставляет нужный интерфейс.
В этом случае сам Manager должен будет кидать аналоги скобок begin(Insert/Delete), end(Insert/Delete), а модели будут их только ретранслировать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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