Russian Qt Forum
Июля 01, 2025, 12:42
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QScrollArea со множеством виджетов
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QScrollArea со множеством виджетов (Прочитано 10353 раз)
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...