Russian Qt Forum

Qt => Qt Quick => Тема начата: BuRn от Август 10, 2014, 18:29



Название: Кто как борется с большим объемом данных
Отправлено: BuRn от Август 10, 2014, 18:29
Добрый день. Интересует кто как выкручивается из ситуации, когда репитор к примеру имеет модель из 400 000 элементов и ему нужно все это отрисовать. Встала проблема размещения огромного количества элементов на Flickable, склоняюсь к варианту отображения лишь 100, к примеру, и пересоздании модели с новыми элементами. А как выкручиваетесь вы ?


Название: Re: Кто как борется с большим объемом данных
Отправлено: navrocky от Август 10, 2014, 18:57
ListView предназначен для этого. Он создает элементы только видимые на экране.


Название: Re: Кто как борется с большим объемом данных
Отправлено: BuRn от Август 12, 2014, 22:57
ListView предназначен для этого. Он создает элементы только видимые на экране.
5.3 Вы его пробовали хотя бы на 1000 элементах ?


Название: Re: Кто как борется с большим объемом данных
Отправлено: navrocky от Август 13, 2014, 08:54
ListView предназначен для этого. Он создает элементы только видимые на экране.
5.3 Вы его пробовали хотя бы на 1000 элементах ?

Этим вопросом прямо меня смутили. В доке эта ситуация отдельно расписана:

Цитировать
The Repeater type creates all of its delegate items when the repeater is first created. This can be inefficient if there are a large number of delegate items and not all of the items are required to be visible at the same time. If this is the case, consider using other view types like ListView (which only creates delegate items when they are scrolled into view) or use the Dynamic Object Creation methods to create items as they are required.

Вот проверка, ваши 400 000 элементов плавно скроллируются как и положено:
Код
Javascript
import QtQuick 2.2
 
Rectangle {
   width: 360
   height: 360
   focus: true
   Keys.onPressed: {
       switch (event.key) {
       case Qt.Key_Home:
           listView.contentY = 0;
           break;
       case Qt.Key_End:
           listView.contentY = listView.contentHeight - listView.height
           break;
       }
   }
 
   ListView {
       id: listView
       anchors.fill: parent
       model: 400000
       delegate: Rectangle {
           width: listView.width
           height: text.implicitHeight + 20 + (index % 5 == 0 ? 30 : 0)
           color: index % 2 == 0 ? "white" : "lightGray"
           Text {
               id: text
               anchors.fill: parent
               horizontalAlignment: Text.AlignHCenter
               verticalAlignment: Text.AlignVCenter
               text: index + " of " + listView.count
           }
       }
   }
}


Название: Re: Кто как борется с большим объемом данных
Отправлено: BuRn от Август 13, 2014, 23:36
Все бы хорошо, а попробуйте теперь переделать его так, вставить внутрь репитор, который будет создавать объекты, репитор по модели из 100+к элементов, не просто квадратов , а что - то посерьезнее, словите креш


Название: Re: Кто как борется с большим объемом данных
Отправлено: navrocky от Август 14, 2014, 08:24
Все бы хорошо, а попробуйте теперь переделать его так, вставить внутрь репитор, который будет создавать объекты, репитор по модели из 100+к элементов, не просто квадратов , а что - то посерьезнее, словите креш
Я не понимаю, зачем вам сдался этот Repeater, он явно же не расчитан на большое количество элементов, т.к. сразу все создает.
Если надо ListView внутри итема в ListView - не проблема, это работает.


Название: Re: Кто как борется с большим объемом данных
Отправлено: BuRn от Август 14, 2014, 20:05
Все бы хорошо, а попробуйте теперь переделать его так, вставить внутрь репитор, который будет создавать объекты, репитор по модели из 100+к элементов, не просто квадратов , а что - то посерьезнее, словите креш
Я не понимаю, зачем вам сдался этот Repeater, он явно же не расчитан на большое количество элементов, т.к. сразу все создает.
Если надо ListView внутри итема в ListView - не проблема, это работает.
В том то и проблема что нужен скроллвью, что в нем будет не важно, важно что бы оно все листалось, а листаться оно будет если создадутся все эелементы, для этого репитор и нужен


Название: Re: Кто как борется с большим объемом данных
Отправлено: gil9red от Август 14, 2014, 20:13
Все бы хорошо, а попробуйте теперь переделать его так, вставить внутрь репитор, который будет создавать объекты, репитор по модели из 100+к элементов, не просто квадратов , а что - то посерьезнее, словите креш
Я не понимаю, зачем вам сдался этот Repeater, он явно же не расчитан на большое количество элементов, т.к. сразу все создает.
Если надо ListView внутри итема в ListView - не проблема, это работает.
В том то и проблема что нужен скроллвью, что в нем будет не важно, важно что бы оно все листалось, а листаться оно будет если создадутся все эелементы, для этого репитор и нужен

Создать элементы можно через модель ;)


Название: Re: Кто как борется с большим объемом данных
Отправлено: BuRn от Август 14, 2014, 20:47
Все бы хорошо, а попробуйте теперь переделать его так, вставить внутрь репитор, который будет создавать объекты, репитор по модели из 100+к элементов, не просто квадратов , а что - то посерьезнее, словите креш
Я не понимаю, зачем вам сдался этот Repeater, он явно же не расчитан на большое количество элементов, т.к. сразу все создает.
Если надо ListView внутри итема в ListView - не проблема, это работает.
В том то и проблема что нужен скроллвью, что в нем будет не важно, важно что бы оно все листалось, а листаться оно будет если создадутся все эелементы, для этого репитор и нужен

Создать элементы можно через модель ;)
через какую модель ? о чем вы ? весь скролл строится через модель, репитор перебирает элементы этой модели по описанному делегату и пихает его в скролл вью


Название: Re: Кто как борется с большим объемом данных
Отправлено: gil9red от Август 14, 2014, 23:15
Все бы хорошо, а попробуйте теперь переделать его так, вставить внутрь репитор, который будет создавать объекты, репитор по модели из 100+к элементов, не просто квадратов , а что - то посерьезнее, словите креш
Я не понимаю, зачем вам сдался этот Repeater, он явно же не расчитан на большое количество элементов, т.к. сразу все создает.
Если надо ListView внутри итема в ListView - не проблема, это работает.
В том то и проблема что нужен скроллвью, что в нем будет не важно, важно что бы оно все листалось, а листаться оно будет если создадутся все эелементы, для этого репитор и нужен

Создать элементы можно через модель ;)
через какую модель ? о чем вы ? весь скролл строится через модель, репитор перебирает элементы этой модели по описанному делегату и пихает его в скролл вью

Например, создайте собственную модель с нужными Вам ролями, после отображайте в делегате как захотите :)
https://github.com/gil9red/ListFiles (https://github.com/gil9red/ListFiles) -- сама модель написана на с++


И Вам уже ответили в чем причина торможения:
ListView предназначен для этого. Он создает элементы только видимые на экране.
5.3 Вы его пробовали хотя бы на 1000 элементах ?
...
Цитировать
The Repeater type creates all of its delegate items when the repeater is first created. This can be inefficient if there are a large number of delegate items and not all of the items are required to be visible at the same time. If this is the case, consider using other view types like ListView (which only creates delegate items when they are scrolled into view) or use the Dynamic Object Creation methods to create items as they are required.
...
Вот тут:
The Repeater type creates all of its delegate items when the repeater is first created. This can be inefficient if there are a large number of delegate items and not all of the items are required to be visible at the same time. If this is the case, consider using other view types like ListView (which only creates delegate items when they are scrolled into view) or use the Dynamic Object Creation methods to create items as they are required.

Update.
В https://github.com/gil9red/ListFiles (https://github.com/gil9red/ListFiles), ради теста временно изменил (коммит не отправлял) код загрузки из xml на добавление всех файлов из корня диска, а также поставил счетчик на ограничение в 450к файлов, все очень шустро, без лагов скролило.