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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сохранение нарисованного QPainter'ом и рисовани  (Прочитано 4022 раз)
Lagovas
Гость
« : Июль 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 Offline

Сообщений: 480



Просмотр профиля
« Ответ #1 : Июль 20, 2012, 13:44 »

И второй вопрос. В реализации прорисовки сделано так, что стирается у змеи хвост и рисуется новая голова со смещенной координатой, что бы не прорисовывать статичные низменяемые при движении блоки. Здесь же при вызове paintEvent стирается полностью вся поверхность и, по идее, нужно рисовать каждый раз поле, змею, еду и т.п. целиком. По сути, это лишнее потребление ресурсов. Мб есть какой нить флаг или что нибудь такого, что бы оно не стирало, а запоминало? Вроде пробовал искать подобное в QPainter'е и QWidget'е, не нашел.
Заранее спасибо.
Если только рисовать на QImage, а его уже в paintEvent отрисовывать. М.б. это не единственный вариант, но все равно вариант )
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Lagovas
Гость
« Ответ #2 : Июль 20, 2012, 13:50 »

Так ведь тоже самое будет получаться. Отрисовываться будет весь QImage, а не лишь нужные части. Тоже самое ведь. Конечно мб это производительнее чем рисовать сначала фон, потом на фоне змею, потом еду, ибо оверхед на прорисовке блоков змеи и еды поверх фона. Если через QImage делать, то прорисовка один раз без оверхеда по идее, но это уже экономия на спичках наверное) По ходу придется все сразу рисовать... Странно что не предусмотрено лишь часть обновлять.
Записан
Bepec
Гость
« Ответ #3 : Июль 20, 2012, 13:58 »

Я по секрету скажу - ты можешь это сделать Веселый

Есть такая интересная фиговинка в QPaintEvent, как rect ().

Вот тебе и участок, который надо перерисовать. Остальное в перерисовке не нуждается.

PS тебе дана полная свобода действий. Действуй Веселый
Записан
Lagovas
Гость
« Ответ #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
Гость
« Ответ #5 : Июль 20, 2012, 14:20 »

Пробуй. Что тебе сказать.

По документации, QTreeView/QTableView используют частичную отрисовку, можешь посмотреть их исходники.

PS а так по идее да - обновиться только твой кусочище с половинкой змеи. Оставшейся половинке будет грустно и печально Веселый
Записан
Lagovas
Гость
« Ответ #6 : Июль 20, 2012, 17:05 »

Да, с Rect все норм получается. Но что на счет второго вопроса. Можно ли как то что то передать в другой класс не унаследованный от QWidget, что бы из него рисовать? Пробовал и QPainter передавать, и даже указатель на виджет пробовал, что бы при создании QPainter его указывать, но чет не получается.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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