Как стать автором
Обновить

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

Спасибо за статью. Много узнал нового.
Вопрос относительно loader'ов и делегатов в списках. Часто хочется в списке отображать сложную информацию и получается, что каждый элемент списка имеет свою высоту, от этого бывают тупняки в скроллинге и опять же от этого высота скроллбара начинает плясать, есть какие-то рецепты на этот счет?
Я сам использую Loader в списках и элементы разной высоты. Возможно, дело в самом скроллбаре и он некорректно обрабатывает изменение размера элементов. Могу сказать, что свой скроллбар я чинил неоднократно, пока он не стал работать во всех ситуациях как надо )
На какой версии Qt получаются лаги?
Лаги вылезают на Qt 4.7.4 на MeeGo, приходится задирать до предела cache buffer. На Qt5 вроде плавнее, но тут и видео гораздо мощнее, может просто эффект незаметен.
Посмотрел старую версию своего проекта, которая на 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, например, при изменении текущего файла?

Благодарю!

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

Публикации

Истории