Название: Невозможно обновить QTreeView из внешнего кода... Отправлено: 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 часа безуспешно мыкаться с элементарной операцией вставки строк. Ужас. Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: ритт от Января 12, 2008, 22:19 Цитировать void QAbstractItemView::reset () [virtual slot] Reset the internal state of the view. beginInsertRows() и endInsertRows() желательно звать непосредственно из insertRow() /* до и после добавления строк{и,} */ чтобы дать вьюхе знать о произошедших изменениях Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Cyrax от Января 12, 2008, 22:24 Вопрос попроще: с чем связать сигнал clicked() кнопки добавления ?
Кнопка расположена на форме, на которой находится QTableView ? Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Cyrax от Января 13, 2008, 22:02 Блин, ну что за херня. Для обновления ячеек представления (после изменения количества рядов) вызываю метод reset() модели. В результате у представления сбрасываются настройки ресайза рядов и столбцов. Ужас. Работать невозможно.
Неужели невозможно из модели "заставить" представление обновить содержимое своих ячеек + число столбцов, чтобы при этом оно не сбрасывло никакие свои параметры ? Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Racheengel от Января 14, 2008, 17:47 что то я не понял проблемы...
Разве после вставки данных в модель, QTreeView не обновляет свое содержимое??? Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Cyrax от Января 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 всё это имеет более сложную структуру), но и заголовки, их структуру. Мне всего лишь нужно обновить все данные представления, включая количество строк и столбцов и не сбрасывая настройки представления (ресайз и т.п.)... Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: pastor от Января 14, 2008, 20:19 А каким образом модель получает данные из Manager?
Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Cyrax от Января 14, 2008, 20:29 Цитировать А каким образом модель получает данные из Manager Указатель на Manager передаю в конструктор модели.Если возникают вопросы, почему я выбрал именно такую организацию данных, можно глянуть сюда: http://prog.org.ru/forum/index.php/topic,6704.0.html Текущий вопрос: Как обновить все данные представления, начиная с количества строк и столбцов и не сбрасывая настройки представления (ресайз и т.п.) ? Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Racheengel от Января 14, 2008, 22:21 может это сделать:
void QAbstractItemModel::layoutChanged () ? из прокси-модели? Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Cyrax от Января 14, 2008, 22:24 Цитировать void QAbstractItemModel::layoutChanged () ? И представление обновит свои данные ?И почему именно прокси ? У меня сейчас нет прокси-моделей. Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Racheengel от Января 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(). Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Tonal от Января 15, 2008, 08:38 У нас изменение данных реализовано примерно следующим образом:
1) Менеджер посылает всем сигнал "начало изменений" На этот сигнал обычно идёт заморозка интерфейса и. т.п. 2) Менеджер посылает сигналы о том, что добавились/удалились/изменились некоторые объекты (список овъектов идёт с сигналом). На это модели делают begin(Insert/Delete), end(Insert/Delete)... 3) Менеджер посылает всем сигнал "окончено изменение" На это интерфейсы размораживаются. В реальности несколько сложнее. Но суть такая. Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Cyrax от Января 15, 2008, 09:22 Tonal, изменение данных происходит непосредственно в Manager'е или в моделях (которые работают с менеджером) ?
Название: Re: Невозможно обновить QTreeView из внешнего кода... Отправлено: Tonal от Января 15, 2008, 10:56 Изменения данных - в Manager'е
У нас модели хранят списки ссылок на данные. По сигналу о добавлении/удалении/изменении изменяется состав этих списков. В принципе можно обойтись без списков в моделях, если Manager предоставляет нужный интерфейс. В этом случае сам Manager должен будет кидать аналоги скобок begin(Insert/Delete), end(Insert/Delete), а модели будут их только ретранслировать. |