Russian Qt Forum
Ноябрь 26, 2024, 05:17
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
Сохранение нарисованного QPainter'ом и рисовани
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Сохранение нарисованного QPainter'ом и рисовани (Прочитано 4020 раз)
Lagovas
Гость
Сохранение нарисованного QPainter'ом и рисовани
«
:
Июль 20, 2012, 12:15 »
Два вопроса. Для начала предисловие. Решил портировать змейку с C# на С++ с использованием Qt. Реализовано так, что есть интерфейс IDrawBlock, который отвечает за прорисовку блока с параметрами координаты и цвета. Реализация интерфейса по задумке должна зависеть от того, чем и как рисуется. Для проверки написал рабочую змею на шарпе, там с главного окна я передавал рисующую поверхность обьекту Block (реализация IDrawBlock под шарп winforms), и он там рисует уже на поверхности.
При портировании получились маленькие неувязки. Пробовал передавать QPainter созданный в главной форме унаследованной от QWidget реализации Block под Qt, что бы в нем вызывать что то типа painter->drawRect(...);, но выдавало что painter не инициализирован. Пробовал в главной форме его инициализировать painter->begin(), всеравно. Не знаю почему так. Можно ли как то сделать передачу paintera? Что бы не нужно было Block наследовать от QWidget. В принципе себе для рабочего состояния унаследовал (в принципе логично что реализация Block может меняться в зависимости от способа прорисовки\фреймворка), но просто на будущее интересно, можно ли так делать.
И второй вопрос. В реализации прорисовки сделано так, что стирается у змеи хвост и рисуется новая голова со смещенной координатой, что бы не прорисовывать статичные низменяемые при движении блоки. Здесь же при вызове paintEvent стирается полностью вся поверхность и, по идее, нужно рисовать каждый раз поле, змею, еду и т.п. целиком. По сути, это лишнее потребление ресурсов. Мб есть какой нить флаг или что нибудь такого, что бы оно не стирало, а запоминало? Вроде пробовал искать подобное в QPainter'е и QWidget'е, не нашел.
Заранее спасибо.
«
Последнее редактирование: Июль 20, 2012, 12:17 от Lagovas
»
Записан
Kurles
Бывалый
Offline
Сообщений: 480
Re: Сохранение нарисованного QPainter'ом и рисовани
«
Ответ #1 :
Июль 20, 2012, 13:44 »
Цитата: Lagovas от Июль 20, 2012, 12:15
И второй вопрос. В реализации прорисовки сделано так, что стирается у змеи хвост и рисуется новая голова со смещенной координатой, что бы не прорисовывать статичные низменяемые при движении блоки. Здесь же при вызове paintEvent стирается полностью вся поверхность и, по идее, нужно рисовать каждый раз поле, змею, еду и т.п. целиком. По сути, это лишнее потребление ресурсов. Мб есть какой нить флаг или что нибудь такого, что бы оно не стирало, а запоминало? Вроде пробовал искать подобное в QPainter'е и QWidget'е, не нашел.
Заранее спасибо.
Если только рисовать на QImage, а его уже в paintEvent отрисовывать. М.б. это не единственный вариант, но все равно вариант )
Записан
Код
C++ (Qt)
while
(
!
asleep
(
)
)
sheep
++;
Lagovas
Гость
Re: Сохранение нарисованного QPainter'ом и рисовани
«
Ответ #2 :
Июль 20, 2012, 13:50 »
Так ведь тоже самое будет получаться. Отрисовываться будет весь QImage, а не лишь нужные части. Тоже самое ведь. Конечно мб это производительнее чем рисовать сначала фон, потом на фоне змею, потом еду, ибо оверхед на прорисовке блоков змеи и еды поверх фона. Если через QImage делать, то прорисовка один раз без оверхеда по идее, но это уже экономия на спичках наверное) По ходу придется все сразу рисовать... Странно что не предусмотрено лишь часть обновлять.
Записан
Bepec
Гость
Re: Сохранение нарисованного QPainter'ом и рисовани
«
Ответ #3 :
Июль 20, 2012, 13:58 »
Я по секрету скажу - ты можешь это сделать
Есть такая интересная фиговинка в QPaintEvent, как rect ().
Вот тебе и участок, который надо перерисовать. Остальное в перерисовке не нуждается.
PS тебе дана полная свобода действий. Действуй
Записан
Lagovas
Гость
Re: Сохранение нарисованного QPainter'ом и рисовани
«
Ответ #4 :
Июль 20, 2012, 14:08 »
А, т.е. когда вызываем у виджета repaint, передаем туда свой QPaintEvent со своим rect, и при рисовании оно будет трогать только этот кусок и не более?
Т.е. если виджет все поле где распологается фон, змея и еда, и вызвать у него repaint(new QPaintEvent(new QRect(snakeHeadX, snakeHeadY, size, size)), то при прорисовке будет трогаться лишь этот кусок? Если я при рисовании зафигачу painter.drawRect(0,0,this->width(),this->height()), оно нарисуется лишь в том маленьком QRect что я передал или на всем виджете?
Записан
Bepec
Гость
Re: Сохранение нарисованного QPainter'ом и рисовани
«
Ответ #5 :
Июль 20, 2012, 14:20 »
Пробуй. Что тебе сказать.
По документации, QTreeView/QTableView используют частичную отрисовку, можешь посмотреть их исходники.
PS а так по идее да - обновиться только твой кусочище с половинкой змеи. Оставшейся половинке будет грустно и печально
Записан
Lagovas
Гость
Re: Сохранение нарисованного QPainter'ом и рисовани
«
Ответ #6 :
Июль 20, 2012, 17:05 »
Да, с Rect все норм получается. Но что на счет второго вопроса. Можно ли как то что то передать в другой класс не унаследованный от QWidget, что бы из него рисовать? Пробовал и QPainter передавать, и даже указатель на виджет пробовал, что бы при создании 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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...