Russian Qt Forum
Май 02, 2024, 02:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Виртуальный QListView  (Прочитано 24307 раз)
IUnknown
Гость
« Ответ #15 : Май 11, 2005, 20:52 »

Мне действительно очеь надо реализовать виртуальный список под Unix и я остановил свой выбор на Qt, но так как с помощью этой библиотеки полноценной виртуальности реализовать не представляется возможным, может кто посоветует другую библиотеку где это делается без проблем, а то срочно нужно портировать виндосную прогу под FreeBSD.
Записан
Kostya.
Гость
« Ответ #16 : Май 12, 2005, 09:02 »

Цитата: "ANM"
Потому что sizeof(QListViewItem) = 44, слишком дорого для одной записи. А LISTVIEW на самом деле не хранит никакой информации записях. Объясню почему:
Цитировать
virtual list-view control maintains very little item information itself. Except for the item selection and focus information, the owner of the control must manage all item information.

Размер информации о фокусе это sizeof(int), только одна запись имеет фокус. Информация о выбранных пользователем записях имеет динамический изменяющийся размер,и если нет выбранных записей то и размер равен 0. Как это сделано? Очень просто - связанный список например.
Итог: QListView обязательно расходует 44 байта на каждую запись, LISTVIEW может вообще расходовать 0 байт на запись если одновременно разрешено выбирать только одну запись.


Я просто взял в тупую сделал sizeof(LVITEM), у меня получилось 40. Согласитесь что разница не большая.
Т.е. CListView обязательно расходует 40 байт на запись.
Почему вы фразу  "maintains very little item information " переводите как "вообще не расходует"?

То IUnknown: Что вы понимаете под полноценным виртуальным списком?
Записан
ANM
Гость
« Ответ #17 : Май 13, 2005, 10:17 »

Дело в том, что LVITEM не хранится в LISTVIEW, это структура просто часть интерфейса. Поэтому sizeof(LVITEM) может быть любым, даже большим чем  sizeof(QListViewItem).
В подтверждении моих слов я нашел пример: LISTVIEW отображающий 100 000 000 записей, после запуска программа потребляет всего 408 Кб оперативной памяти. Причем я пробовал изменять кол-во записей от 100 000 до 100 000 000, объем потребляемой памяти не менялся.
Программу можно взять здесь (исходные тексты + исполняемый файл).
Сможете сделать такой же пример, используя QListView? :wink:
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #18 : Май 13, 2005, 13:41 »

Может, контест проведем? Улыбающийся))))))))))))))
Записан

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 не волк, в лес не уйдёт
Kostya.
Гость
« Ответ #19 : Май 13, 2005, 14:15 »

Цитата: "ANM"
Дело в том, что LVITEM не хранится в LISTVIEW, это структура просто часть интерфейса. Поэтому sizeof(LVITEM) может быть любым, даже большим чем  sizeof(QListViewItem).

В принципе конечно, возможно

Цитата: "ANM"

В подтверждении моих слов я нашел пример: LISTVIEW отображающий 100 000 000 записей, после запуска программа потребляет всего 408 Кб оперативной памяти. Причем я пробовал изменять кол-во записей от 100 000 до 100 000 000, объем потребляемой памяти не менялся.
Программу можно взять здесь (исходные тексты + исполняемый файл).
Сможете сделать такой же пример, используя QListView? :wink:


Это всеж таки немного не тот пример Улыбающийся. Т.к. число элементов известно заранее, что делать если число элементов не известно.

Кстати  откуда взялась цифра 406К. LISTVIEW, НЕ хранит все 10 000 000 в памяти, а подгружает их из кэша. Поэтому он и занимает постоянно 406К, даже если используется 1 элемент.
А отсюда, вы не можете делать вывод, что он не хранить всю структуру LVITEM
Записан
ANM
Гость
« Ответ #20 : Май 13, 2005, 16:48 »

Цитировать
Это всеж таки немного не тот пример . Т.к. число элементов известно заранее, что делать если число элементов не известно.

Разговор шел именно о выводе известного кол-ва элементов. Вывод неизвестного кол-ва элементов наверное будет выглядеть чуть по другому, например явно не нужно отображать скроллбар.
Цитировать

Кстати откуда взялась цифра 406К. LISTVIEW, НЕ хранит все 10 000 000 в памяти, а подгружает их из кэша. Поэтому он и занимает постоянно 406К, даже если используется 1 элемент.
А отсюда, вы не можете делать вывод, что он не хранить всю структуру LVITEM

А это не одно и тоже? Разговор шел о том что QListView обязательно создает QListViewItem на каждый элемент находящийся в таблице. LISTVIEW имеет режим виртуального вывода при котором LISTVIEW не хранит никакой информации связанной с элементом, а всю информацию запрашивает у пользователя.
Можете привести аналогичный пример с QListView, чтобы показывал 100 000 000 записей?
Записан
Sergeich
Гость
« Ответ #21 : Май 13, 2005, 18:15 »

с QListView ниче такого не получится, но виртуальный список легко реализуется через QTable
Записан
Kostya.
Гость
« Ответ #22 : Май 14, 2005, 08:47 »

Цитата: "ANM"
Разговор шел именно о выводе известного кол-ва элементов. Вывод неизвестного кол-ва элементов наверное будет выглядеть чуть по другому, например явно не нужно отображать скроллбар.

Ну, значит упустил Улыбающийся

Цитата: "ANM"

Цитировать

Кстати откуда взялась цифра 406К. LISTVIEW, НЕ хранит все 10 000 000 в памяти, а подгружает их из кэша. Поэтому он и занимает постоянно 406К, даже если используется 1 элемент.
А отсюда, вы не можете делать вывод, что он не хранить всю структуру LVITEM

А это не одно и тоже? Разговор шел о том что QListView обязательно создает QListViewItem на каждый элемент находящийся в таблице. LISTVIEW имеет режим виртуального вывода при котором LISTVIEW не хранит никакой информации связанной с элементом, а всю информацию запрашивает у пользователя.
Можете привести аналогичный пример с QListView, чтобы показывал 100 000 000 записей?


Да, QListView, при неизвестном количестве элементов, будет создавать на каждый элемент QListViewItem, впрочем как и CListCtrl!
Для реализации списка с известным числом элементов, есть QTable.
Я забыл, в MFC есть класс наподобие QTable?
Если нет, то можно переобозвать QTable в QListView и повторить ваш пример с CListCtrl Улыбающийся
Записан
ANM
Гость
« Ответ #23 : Май 14, 2005, 10:03 »

Цитата: "Sergeich"
с QListView ниче такого не получится, но виртуальный список легко реализуется через QTable

Да можно, но какой ценой? Заставляют самостоятельно отрисовывать элементы. :x Нет бы просто данные запрашивать.
Цитата: "Kostya."
Да, QListView, при неизвестном количестве элементов, будет создавать на каждый элемент QListViewItem, впрочем как и CListCtrl!

Да, известно кол-во элементов, просто оно очень большое.
CListCtrl это обертка над LISTVIEW, так что все что умеет LISTVIEW умеет и CListCtrl.

Я кстати прочитал что в принципе можно использовать и LISTVIEW в QT. Сделать C++ обертку (наследника от QWidget) чтоб интерфейс нормальный был, и назвать это WListView  :lol:
Записан
Kostya.
Гость
« Ответ #24 : Май 14, 2005, 10:33 »

Цитата: "ANM"
Я кстати прочитал что в принципе можно использовать и LISTVIEW в QT. Сделать C++ обертку (наследника от QWidget) чтоб интерфейс нормальный был, и назвать это WListView  :lol:


 Улыбающийся
Записан
Виталий
Гость
« Ответ #25 : Май 20, 2005, 22:06 »

Действительно, большие объемы данных можно выводить при помощи QTable. Я имел дело с классом, отнаследованным от QListView, в котором полностью подменялся (по моему) правый scroll bar. В общем работало. Я хочу предложить новое решение - Qt4. Там реализован паттерн Model/View. Это позволит с легкостью решить вашу проблему. Qt4 пока только в beta-версии.

Виталий
Записан
Const
Гость
« Ответ #26 : Май 24, 2005, 14:17 »

Цитата: "Виталий"
Я имел дело с классом, отнаследованным от QListView, в котором полностью подменялся (по моему) правый scroll bar.

А можно по подробнее, как это все было устроено?  :oops:
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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