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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QScrollArea со множеством виджетов  (Прочитано 9857 раз)
Nimbus
Гость
« : Декабрь 15, 2011, 07:05 »

Передо мной стоит задача запихнуть в один виджет 700-900 почти одинаковых виджетов. Соответственно иду по самому простому пути:
1. Создаю QScrollArea *pArea
2. Создаю QWidget *pWidget, кладём в него QVBoxLayout *layout
3. В каком-то сферическом цикле в вакууме добавляем виджеты в *layout
4. pArea->setWidget(pWidget);
5. pArea->show();

Проблема вся в том, что между 4 и 5 действиями проходят нехилые 2 секунды. Это много. По моему скромному мнению, для pWidget вызывается рекурсивный вызов перерисовки всех дочерних виджетов. Как можно обойти данный изъян, перерисовывая, например, только видимые виджеты? Или, может, есть аналогичные QScrollArea виджеты для решения такой задачи?
« Последнее редактирование: Декабрь 15, 2011, 07:09 от JC » Записан
Bepec
Гость
« Ответ #1 : Декабрь 15, 2011, 07:22 »

Прошу уточнить, а зачем? Что надо сделать?

Ибо ваша задача... неоптимальна скажем так.

PS проверял, что 1к виджетов типа "QPushButton" тормозят двухъядерную машину Улыбающийся
Записан
Nimbus
Гость
« Ответ #2 : Декабрь 15, 2011, 07:37 »

Возможно, да. Нужно каким-то способом отображать в один момент времени, например, 10 из 1000 виджетов. И прокручивать скроллбаром этот родительский виджет. Это всё сводится к созданию виджета с 10-ю позициями для дочерних виджетов и скроллбаром. По мере прокрутки уничтожать виджеты и на их месте создавать новые. Но тут возникает ещё две проблемы:
  • все виджеты разного размера и могут менять свой размер в процессе работы, поэтому полосу для прокрутки и размер ползунка не высчитать сразу;
  • виджеты изменяются сами по себе в процессе работы (может текст в каком-то поменяется, может цвет, может добавятся новые в него виджеты), поэтому сохранять их состояние тоже весьма проблематично
Записан
Fat-Zer
Гость
« Ответ #3 : Декабрь 15, 2011, 08:09 »

может тогда глянуть в сторону Model/View? Вроде это всё должно из коробки появиться при реализации своего вида [FIXME]...
Записан
Nimbus
Гость
« Ответ #4 : Декабрь 15, 2011, 08:20 »

может тогда глянуть в сторону Model/View? Вроде это всё должно из коробки появиться при реализации своего вида [FIXME]...
А вы уверены, что какой-нибудь QListView работает именно так как я хочу, и нет провисания между установкой модели и отображением?

P. S. посмотрел сейчас событие paintEvent у pWidget - оно всё-таки вызывается позже этого провисания. Выходит, дело не в перерисовке.
Записан
Bepec
Гость
« Ответ #5 : Декабрь 15, 2011, 08:25 »

Уважаемый JC.

Приведу простой пример:
5,000 QPushButton созданный как виджеты - загрузка 2 ядер на 100%, тормоза при прокручивании/перерисовки.

10,000,000 QPushButton, отрисовываемых в делегате модели (model-view) - никаких тормозов Улыбающийся

Желаю вам посмотреть в сторону model-view.

PS модель работает быстрее, чем простой QScrollArea и тормозов нету.
Записан
Nimbus
Гость
« Ответ #6 : Декабрь 15, 2011, 08:29 »

Bepec, а можете опубликовать для меня исходники, пожалуйста?
Записан
Bepec
Гость
« Ответ #7 : Декабрь 15, 2011, 09:17 »

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

Сейчас попробую пример наваять Улыбающийся вот его могу скинуть.
Записан
Nimbus
Гость
« Ответ #8 : Декабрь 15, 2011, 10:40 »

Bepec, буду очень признателен
Записан
Bepec
Гость
« Ответ #9 : Декабрь 15, 2011, 10:42 »

Внутри чисто код, на 1 кк кнопочек. Конечно времени на разбирание и использование этого кода, уйдет намного больше, но эффект тоже будет немаленьким.
Записан
Nimbus
Гость
« Ответ #10 : Декабрь 15, 2011, 11:01 »

Спасибо!

Код
C++ (Qt)
QApplication::style()->drawControl(QStyle::CE_PushButton,&but, painter);
 
Только один вопрос: как быть с кастомными виджетами в этом случае?
Записан
Bepec
Гость
« Ответ #11 : Декабрь 15, 2011, 12:03 »

Ну вот тут вопрос встает -а что за виджеты и зачем тебе надо и какие Улыбающийся

Опиши подробнее задачу ^^
Записан
Nimbus
Гость
« Ответ #12 : Декабрь 15, 2011, 12:08 »

Ну вот тут вопрос встает -а что за виджеты и зачем тебе надо и какие Улыбающийся

Опиши подробнее задачу ^^

Скажем так кастом-виджет с CSS-стилем, в нём, например, 3 QLabel'а, причём, у двух из них установлены пиксмапы.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Декабрь 15, 2011, 12:11 »

Может имеет смысл перейти на QGraphicsView/Scene?
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #14 : Декабрь 15, 2011, 12:14 »

скажем так - мне неясно зачем такое, что с ними можно делать (редактировать или нажимать их можно или нельзя), потому мб тебе стоит попробовать всё самому.

GreatSnake плохого не скажет Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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