Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Lagovas от Июль 20, 2012, 12:15



Название: Сохранение нарисованного QPainter'ом и рисовани
Отправлено: 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'е, не нашел.
Заранее спасибо.


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


Название: Re: Сохранение нарисованного QPainter'ом и рисовани
Отправлено: Lagovas от Июль 20, 2012, 13:50
Так ведь тоже самое будет получаться. Отрисовываться будет весь QImage, а не лишь нужные части. Тоже самое ведь. Конечно мб это производительнее чем рисовать сначала фон, потом на фоне змею, потом еду, ибо оверхед на прорисовке блоков змеи и еды поверх фона. Если через QImage делать, то прорисовка один раз без оверхеда по идее, но это уже экономия на спичках наверное) По ходу придется все сразу рисовать... Странно что не предусмотрено лишь часть обновлять.


Название: Re: Сохранение нарисованного QPainter'ом и рисовани
Отправлено: Bepec от Июль 20, 2012, 13:58
Я по секрету скажу - ты можешь это сделать :D

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

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

PS тебе дана полная свобода действий. Действуй :D


Название: Re: Сохранение нарисованного QPainter'ом и рисовани
Отправлено: Lagovas от Июль 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 что я передал или на всем виджете?


Название: Re: Сохранение нарисованного QPainter'ом и рисовани
Отправлено: Bepec от Июль 20, 2012, 14:20
Пробуй. Что тебе сказать.

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

PS а так по идее да - обновиться только твой кусочище с половинкой змеи. Оставшейся половинке будет грустно и печально :D


Название: Re: Сохранение нарисованного QPainter'ом и рисовани
Отправлено: Lagovas от Июль 20, 2012, 17:05
Да, с Rect все норм получается. Но что на счет второго вопроса. Можно ли как то что то передать в другой класс не унаследованный от QWidget, что бы из него рисовать? Пробовал и QPainter передавать, и даже указатель на виджет пробовал, что бы при создании QPainter его указывать, но чет не получается.