Обновить

Комментарии 10

Спасибо за статью. Много узнал нового.
НЛО прилетело и опубликовало эту надпись здесь
Я сам использую Loader в списках и элементы разной высоты. Возможно, дело в самом скроллбаре и он некорректно обрабатывает изменение размера элементов. Могу сказать, что свой скроллбар я чинил неоднократно, пока он не стал работать во всех ситуациях как надо )
На какой версии Qt получаются лаги?
НЛО прилетело и опубликовало эту надпись здесь
Посмотрел старую версию своего проекта, которая на Qt 4.8.3. Действительно скролл лагает нещадно, в пятой такого и близко нет.

В пятой версии немного поменяли поведение:
«The cacheBuffer property now has a non-zero default and delegates in the cacheBuffer are created asynchronously» источник

Я посмотрел, в пятой версии по умолчанию cacheBuffer устанавливается в 320, в четвертой — 0. Поставил в четвертой 320 и стало гораздо лучше, почти без лагов.
НЛО прилетело и опубликовало эту надпись здесь
— Если у вас в одной модели элементы разных типов и должны отображаться, соответственно, по разному. Например контакт-лист в IM-клиенте и в нем как сами контакты, так и группы контактов. Для контактов в Loader загружается один компонент, для групп — другой.
— Если в зависимости от состояния делегата он выглядит сильно по разному, может быть удобно сделать два разных компонента и переключать их в Loader'е, в зависимости от состояния. Например, по умолчанию элемент максимально простой и легкий (именно так и рекомендуется делать), но есть возможность его «развернуть» и он превращается в другой виджет, содержащий кучу всякой дополнительной информации, кнопок, картинок и т.п. Можно все запихнуть в один виджет, но стоит учитывать, что делегаты создаются/уничтожаются на лету. При скролле ListView то, что находится далеко за областью видимостью удаляется, затем создается снова когда туда попадает. Если забить его «тяжелыми» делагатами, то скролл может тормозить.
НЛО прилетело и опубликовало эту надпись здесь
Можно и так, конечно. Это как раз то, о чем я говорил, когда писал про императивный подход.
Впрочем, в Qt5 таким методом можно не только асинхронно создать компонент, но и создать из него объект. Для особо тяжелых объектов разнца видна невооруженным глазом.

Спасибо, интересно, может пригодиться. Скажите, а как выглядел бы код, если qml-файл в source нужно было бы обновить:


  • по сигналу от объекта QObject типа: load(const QString &newFileNme) — т.е. загружаем другой файл
  • по сигналу от QFileWatcher, например, при изменении текущего файла?

Благодарю!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации