Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] QTreeView с загрузкой при разворачивании 
:(
    Опции темы
mugabe
Дата 3.6.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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-а?
PM MAIL   Вверх
pan2004
Дата 3.6.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



Насколько я понял, используется QStandardItemModel. Если не так, поправьте.
Цитата(mugabe @  3.6.2009,  11:37 Найти цитируемый пост)
Но как получить индекс QModelIndex &parent

у QStandardItem есть функция index(), которая собственно и возвращает нужный индекс.
Хотя я бы на вашем месте написал свой класс модели, наследованный от QAbstractItemModel. В QAssistantе была небольшая заметка по вашему случаю("Performance Optimization for Large Amounts of Data", "Lazy Population of Model Data" - из overview "Model Subclassing Reference"). 


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
mugabe
Дата 4.6.2009, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 3.6.2009

Репутация: нет
Всего: нет



Цитата(pan2004 @  3.6.2009,  16:07 Найти цитируемый пост)
у QStandardItem есть функция index(), которая собственно и возвращает нужный индекс.

Я не пользуюсь QStandartItem.
Цитата(pan2004 @  3.6.2009,  16:07 Найти цитируемый пост)
Хотя я бы на вашем месте написал свой класс модели, наследованный от QAbstractItemModel.

Я так и сделал. Писал же, что делал на основе примера Simple Tree Model.
Цитата(pan2004 @  3.6.2009,  16:07 Найти цитируемый пост)
В QAssistantе была небольшая заметка по вашему случаю("Performance Optimization for Large Amounts of Data"

На сколько я понял fetchMore() используется совсем для других случаев.
Цитата(pan2004 @  3.6.2009,  16:07 Найти цитируемый пост)
"Lazy Population of Model Data"

Ну так с самого начала я так и сделал. Но возникла проблема с отрисовкой, из-за задержек с получением данных и вызовом в этот момент QEventLoop::exec()

В общем-то проблему я почти решил. Нашел ответ в вот этом faq.
Но мне кажется надо изначально построить модель как-то по другому, что бы TreeItem сам знал свой индекс. Но т.к. не до конца понимаю устройство этих самых индексов, сделать этого пока не могу.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0413 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.