![]() |
|
|
![]()
|
|
| mugabe |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 3.6.2009 Репутация: нет Всего: нет |
Задача:
Есть огромная древовидная структура данных, загружаемая с удаленного сервера. Сразу грузить всю структуру - долго, да и не нужно. Нужно что бы сначала загружался первый уровень, а при разворачивании загружались только вложенные элементы. Пытался реализовать такое на базе примера Simple Tree Model. Пока что ничего не вышло. Сначала пробовал загружать данные при первом обращении к TreeItem::data(...), child(...), childCount(...) и т.д. И в принципе даже работало, но возникала проблема во время отрисовке, когда вызывался один из вышеперечисленных методов, пока предыдущий вызов еще не успел завершить свою работу. Тут жабу подкинул класс-обертка для QHttp, позволяющая делать синхронные запросы - он вызывает QEventLoop::exec() до тех пор пока не получит ответ, что позволяет выполнить paintEvent() до того, как данные получены :( Это подтолкнуло поступить более правильно (на мой взгляд): 1. При разворачивании элемента он разворачивается, но показывает только один элемент с текстом "Загрузка...". При этом действия пользователя не блокируются и он может делать что-то еще, пока грузятся данные. 2. Когда данные будут загружены, этот элемент удаляется и добавляются настоящие элементы. Но с реализацией этого возникли трудоности. Возможно, из за недостаточного понимания Qt-шной модели MVC, в частности индексов. Сейчас у меня происходит следующее: 1. При первом вызове TreeItem::data(...), child(...), childCount(...) возвращается один элемент с надписью "Загрузка...". 2. В это время через обычный QHttp делается ассинхронный запрос к серверу. Сигнал QHttp::finished(...) привязывается к слоту моей модели requestFinished(...). 3. При завершении запроса срабатывает слот requestFinished(...), анализируются данные пришедшие от сервера и корректируются данные в необходимом TreeItem. И вот тут у меня загвоздка, как после этого дать понять TreeView, что модель обновилась? На сколько я понимаю нужно вызвать QAbstractItemModel::insertRow(int row, const QModelIndex &parent). Но как получить индекс QModelIndex &parent, если у меня есть только ссылка на TreeItem этого parent-а? |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Насколько я понял, используется QStandardItemModel. Если не так, поправьте.
у QStandardItem есть функция index(), которая собственно и возвращает нужный индекс. Хотя я бы на вашем месте написал свой класс модели, наследованный от QAbstractItemModel. В QAssistantе была небольшая заметка по вашему случаю("Performance Optimization for Large Amounts of Data", "Lazy Population of Model Data" - из overview "Model Subclassing Reference"). |
|||
|
||||
| mugabe |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 3.6.2009 Репутация: нет Всего: нет |
Я не пользуюсь QStandartItem.
Я так и сделал. Писал же, что делал на основе примера Simple Tree Model.
На сколько я понял fetchMore() используется совсем для других случаев. Ну так с самого начала я так и сделал. Но возникла проблема с отрисовкой, из-за задержек с получением данных и вызовом в этот момент QEventLoop::exec() В общем-то проблему я почти решил. Нашел ответ в вот этом faq. Но мне кажется надо изначально построить модель как-то по другому, что бы TreeItem сам знал свой индекс. Но т.к. не до конца понимаю устройство этих самых индексов, сделать этого пока не могу. |
||||||
|
|||||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |