Russian Qt Forum
Ноябрь 24, 2024, 15:01
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QScrollArea со множеством виджетов
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QScrollArea со множеством виджетов (Прочитано 9858 раз)
Nimbus
Гость
QScrollArea со множеством виджетов
«
:
Декабрь 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
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #1 :
Декабрь 15, 2011, 07:22 »
Прошу уточнить, а зачем? Что надо сделать?
Ибо ваша задача... неоптимальна скажем так.
PS проверял, что 1к виджетов типа "QPushButton" тормозят двухъядерную машину
Записан
Nimbus
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #2 :
Декабрь 15, 2011, 07:37 »
Возможно, да. Нужно каким-то способом отображать в один момент времени, например, 10 из 1000 виджетов. И прокручивать скроллбаром этот родительский виджет. Это всё сводится к созданию виджета с 10-ю позициями для дочерних виджетов и скроллбаром. По мере прокрутки уничтожать виджеты и на их месте создавать новые. Но тут возникает ещё две проблемы:
все виджеты разного размера и могут менять свой размер в процессе работы, поэтому полосу для прокрутки и размер ползунка не высчитать сразу;
виджеты изменяются сами по себе в процессе работы (может текст в каком-то поменяется, может цвет, может добавятся новые в него виджеты), поэтому сохранять их состояние тоже весьма проблематично
Записан
Fat-Zer
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #3 :
Декабрь 15, 2011, 08:09 »
может тогда глянуть в сторону Model/View? Вроде это всё должно из коробки появиться при реализации своего вида [FIXME]...
Записан
Nimbus
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #4 :
Декабрь 15, 2011, 08:20 »
Цитата: Fat-Zer от Декабрь 15, 2011, 08:09
может тогда глянуть в сторону Model/View? Вроде это всё должно из коробки появиться при реализации своего вида [FIXME]...
А вы уверены, что какой-нибудь QListView работает именно так как я хочу, и нет провисания между установкой модели и отображением?
P. S. посмотрел сейчас событие paintEvent у pWidget - оно всё-таки вызывается позже этого провисания. Выходит, дело не в перерисовке.
Записан
Bepec
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #5 :
Декабрь 15, 2011, 08:25 »
Уважаемый JC.
Приведу простой пример:
5,000 QPushButton созданный как виджеты - загрузка 2 ядер на 100%, тормоза при прокручивании/перерисовки.
10,000,000 QPushButton, отрисовываемых в делегате модели (model-view) - никаких тормозов
Желаю вам посмотреть в сторону model-view.
PS модель работает быстрее, чем простой QScrollArea и тормозов нету.
Записан
Nimbus
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #6 :
Декабрь 15, 2011, 08:29 »
Bepec, а можете опубликовать для меня исходники, пожалуйста?
Записан
Bepec
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #7 :
Декабрь 15, 2011, 09:17 »
Природная жадность говорит нет.
Т.к. разработка коммерческая.
Сейчас попробую пример наваять
вот его могу скинуть.
Записан
Nimbus
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #8 :
Декабрь 15, 2011, 10:40 »
Bepec, буду очень признателен
Записан
Bepec
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #9 :
Декабрь 15, 2011, 10:42 »
Внутри чисто код, на 1 кк кнопочек. Конечно времени на разбирание и использование этого кода, уйдет намного больше, но эффект тоже будет немаленьким.
Записан
Nimbus
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #10 :
Декабрь 15, 2011, 11:01 »
Спасибо!
Код
C++ (Qt)
QApplication
::
style
(
)
->
drawControl
(
QStyle
::
CE_PushButton
,&
but
,
painter
)
;
Только один вопрос: как быть с кастомными виджетами в этом случае?
Записан
Bepec
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #11 :
Декабрь 15, 2011, 12:03 »
Ну вот тут вопрос встает -а что за виджеты и зачем тебе надо и какие
Опиши подробнее задачу ^^
Записан
Nimbus
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #12 :
Декабрь 15, 2011, 12:08 »
Цитата: Bepec от Декабрь 15, 2011, 12:03
Ну вот тут вопрос встает -а что за виджеты и зачем тебе надо и какие
Опиши подробнее задачу ^^
Скажем так кастом-виджет с CSS-стилем, в нём, например, 3 QLabel'а, причём, у двух из них установлены пиксмапы.
Записан
GreatSnake
Джедай : наставник для всех
Offline
Сообщений: 2921
Re: QScrollArea со множеством виджетов
«
Ответ #13 :
Декабрь 15, 2011, 12:11 »
Может имеет смысл перейти на QGraphicsView/Scene?
Записан
Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
Re: QScrollArea со множеством виджетов
«
Ответ #14 :
Декабрь 15, 2011, 12:14 »
скажем так - мне неясно зачем такое, что с ними можно делать (редактировать или нажимать их можно или нельзя), потому мб тебе стоит попробовать всё самому.
GreatSnake плохого не скажет
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...