Russian Qt Forum
Августа 26, 2025, 19:24
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Невозможно обновить QTreeView из внешнего кода...
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Невозможно обновить QTreeView из внешнего кода... (Прочитано 9735 раз)
Cyrax
Гость
Невозможно обновить QTreeView из внешнего кода...
«
:
Января 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 часа безуспешно мыкаться с элементарной операцией вставки строк. Ужас.
Записан
ритт
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #1 :
Января 12, 2008, 22:19 »
Цитировать
void QAbstractItemView::reset () [virtual slot]
Reset the internal state of the view.
beginInsertRows() и endInsertRows() желательно звать непосредственно из insertRow() /* до и после добавления строк{и,} */ чтобы дать вьюхе знать о произошедших изменениях
Записан
Cyrax
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #2 :
Января 12, 2008, 22:24 »
Вопрос попроще: с чем связать сигнал clicked() кнопки добавления ?
Кнопка расположена на форме, на которой находится QTableView ?
Записан
Cyrax
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #3 :
Января 13, 2008, 22:02 »
Блин, ну что за херня. Для обновления ячеек представления (после изменения количества рядов) вызываю метод reset() модели. В результате у представления сбрасываются настройки ресайза рядов и столбцов. Ужас. Работать невозможно.
Неужели невозможно из модели "заставить" представление обновить содержимое своих ячеек + число столбцов, чтобы при этом оно не сбрасывло никакие свои параметры ?
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #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
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #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
Сообщений: 2901
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #6 :
Января 14, 2008, 20:19 »
А каким образом модель получает данные из Manager?
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Cyrax
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #7 :
Января 14, 2008, 20:29 »
Цитировать
А каким образом модель получает данные из Manager
Указатель на Manager передаю в конструктор модели.
Если возникают вопросы, почему я выбрал именно такую организацию данных, можно глянуть сюда:
http://prog.org.ru/forum/index.php/topic,6704.0.html
Текущий вопрос:
Как обновить все данные представления, начиная с количества строк и столбцов и не сбрасывая настройки представления (ресайз и т.п.) ?
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #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
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #9 :
Января 14, 2008, 22:24 »
Цитировать
void QAbstractItemModel::layoutChanged () ?
И представление обновит свои данные ?
И почему именно прокси ? У меня сейчас нет прокси-моделей.
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #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
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #11 :
Января 15, 2008, 08:38 »
У нас изменение данных реализовано примерно следующим образом:
1) Менеджер посылает всем сигнал "начало изменений"
На этот сигнал обычно идёт заморозка интерфейса и. т.п.
2) Менеджер посылает сигналы о том, что добавились/удалились/изменились некоторые объекты (список овъектов идёт с сигналом).
На это модели делают begin(Insert/Delete), end(Insert/Delete)...
3) Менеджер посылает всем сигнал "окончено изменение"
На это интерфейсы размораживаются.
В реальности несколько сложнее. Но суть такая.
Записан
Cyrax
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #12 :
Января 15, 2008, 09:22 »
Tonal
, изменение данных происходит непосредственно в Manager'е или в моделях (которые работают с менеджером) ?
Записан
Tonal
Гость
Re: Невозможно обновить QTreeView из внешнего кода...
«
Ответ #13 :
Января 15, 2008, 10:56 »
Изменения данных - в Manager'е
У нас модели хранят списки ссылок на данные.
По сигналу о добавлении/удалении/изменении изменяется состав этих списков.
В принципе можно обойтись без списков в моделях, если Manager предоставляет нужный интерфейс.
В этом случае сам Manager должен будет кидать аналоги скобок begin(Insert/Delete), end(Insert/Delete), а модели будут их только ретранслировать.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...