Russian Qt Forum
Май 15, 2024, 03:11
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QScrollArea и QPainter
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QScrollArea и QPainter (Прочитано 6115 раз)
RovingStone
Гость
QScrollArea и QPainter
«
:
Май 06, 2015, 12:43 »
Доброго времени суток, форумчане!
У меня появилась необходимость выводить очень большие изображения на экран. Размер изображения - около 20 000 х 20 000 точек. Формировать изображение целиком не получится. Я хочу отрисовывать только видимую на экране часть, с масштабированием. Отрисовку в картинку нужной области с нужным масштабом я представляю как сделать (чем сейчас и занят). Я хочу использовать виджет MyView, размеры которого соответствуют картинке. MyView хочу поместить в QScrollArea и рисовать на нём в видимой области нужный участок изображения через QPainter::drawImage.
С графической частью работал мало, поэтому прошу ответить на несколько моих вопросов.
1. Как работает QPainter? Виджет размером 20k x 20k создается без проблем и памяти кушает мало. Где будет храниться изображение, нарисованное через QPainter::drawImage и очистится ли память, если использовать QPainter::eraseRect?
2. Как можно реализовать прокрутку региона без QScrollArea? Чтобы по факту не содержимое перемещалось, а регион перерисовывался?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QScrollArea и QPainter
«
Ответ #1 :
Май 06, 2015, 13:50 »
С QScrollArea проблем нет, там легко и удобно рисовать только видимую часть - и даже в любом масштабе. Поэтому делать какую-то свою прокрутку ни к чему.
Но вот уместится ли сам QImage такого размера (без всякого рисования) - проблематично. Многие ОС не позволяют выделять такие большие блоки памяти как 1.6 Gb, хотя память и есть физически (и в 64 бит тоже). Сначала проверьте на всех целевых платформах, это гораздо важнее чем рисование
Записан
RovingStone
Гость
Re: QScrollArea и QPainter
«
Ответ #2 :
Май 06, 2015, 14:03 »
Я не собираюсь рисовать сразу всё. Через QWidget::visibleRegion я могу получать текущую область видимую область виджета. Я хочу перерисовывать только её, предварительно стерев всё остальное. Т.е. перемещается виджет в скролле, закончилось перемещение, стёрли старую область, новую нарисовали по текущей видимой области.
Мне и интересно, где хранится изображение, выводимое с QPainter? Или при его использовании Вся область виджета 20К х 20К превращается в "картинку"?
QImage вряд ли когда-то будет больше размера экрана.
Записан
Kurles
Бывалый
Offline
Сообщений: 480
Re: QScrollArea и QPainter
«
Ответ #3 :
Май 06, 2015, 14:10 »
Цитата: RovingStone от Май 06, 2015, 14:03
QImage вряд ли когда-то будет больше размера экрана.
Может тогда лучше полностью своё решение на QScrollBar?
Записан
Код
C++ (Qt)
while
(
!
asleep
(
)
)
sheep
++;
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QScrollArea и QPainter
«
Ответ #4 :
Май 06, 2015, 15:57 »
Цитата: RovingStone от Май 06, 2015, 14:03
Мне и интересно, где хранится изображение, выводимое с QPainter? Или при его использовании Вся область виджета 20К х 20К превращается в "картинку"?
Там где Вы его храните. Пример: простейшее, обычное решение - создать QLabel, ей дать картинку (QLabel::setPixmap) и засунуть эту QLabel в QSctollArea::setWidget. В этом случае изображение будет храниться в пиксмапе (который сидит в QLabel). Но при больших данных так просто может не сработать.
Цитата: RovingStone от Май 06, 2015, 14:03
QImage вряд ли когда-то будет больше размера экрана.
Так а данные где будете хранить? Чтобы их подгружать (подрисовывать) - их надо иметь. Сначала с этим разберитесь, а потом UI рисуйте
Записан
Figaro
Гость
Re: QScrollArea и QPainter
«
Ответ #5 :
Май 12, 2015, 11:01 »
А не проще ли QGraphicsView, QGraphicsScene в Вашем случае?
Записан
RovingStone
Гость
Re: QScrollArea и QPainter
«
Ответ #6 :
Май 15, 2015, 11:59 »
Цитата: Kurles от Май 06, 2015, 14:10
Может тогда лучше полностью своё решение на QScrollBar?
Разобрался с QScrollArea, пишу, пока что нормально получается.
Записан
RovingStone
Гость
Re: QScrollArea и QPainter
«
Ответ #7 :
Май 15, 2015, 12:05 »
Цитата: Igors от Май 06, 2015, 15:57
Так а данные где будете хранить? Чтобы их подгружать (подрисовывать) - их надо иметь. Сначала с этим разберитесь, а потом UI рисуйте
В целом, разобрался. То что на экране уже нарисовано хранится в bitmap на стороне ОС. Если что-то меняется, нужно по-новой перерисовывать. Т.е. QPainter просто рисует на экране, и дополнительно после него ничего очищать не надо. Как-то тяжело это всё пишется, вопрос был поспешный, после пары тестовых примеров что и как работает разобрался.
Спасибо)
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...