Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ltise от Февраль 15, 2011, 14:17



Название: Рисовать миллиметровку
Отправлено: ltise от Февраль 15, 2011, 14:17
Привет всем!

Возникла задача рисовать миллиметровку (и другие варианты мелкой сетки) в бэкраунде рабочей области приложения...Приложение НЕ использует Scene\View, отрисовка ведется прямо в виджет через QPainter, области отрисовки строго отслеживаются..Соответсвенно, миллиметровку тоже надо рисовать "руками" при каждой перерисовке рабочей области, и соотв. при скроле и зуме...если перерисовываются небольшие участки то проблем нет... Но ! как мне кажется, что при большой рабочей области тупое рисование линиями этой самой миллиметровки будет сильно тормозить, особенно на больших мониторах...
И это будет особенно заметно при анимированом "плавном" скроллинге и зуме... линии сетки имеют осмысленную нагрузку, поэтому просто сделать заливку думаю не получится...

Может есть опыт/идеи как лучше решить подобную задачу ?

ЗЫ. еще не пробовал никак.. может и просто линиями прокатит...





Название: Re: Рисовать миллиметровку
Отправлено: GreatSnake от Февраль 15, 2011, 14:24
Можно заливать тайлами. См. QBrush::setTexture(), но не факт, что будет быстрее.


Название: Re: Рисовать миллиметровку
Отправлено: ltise от Февраль 15, 2011, 14:33
Можно заливать тайлами. См. QBrush::setTexture()
Тоже думаю попробовать заливкой, но сразу возникает вопрос -
попасть линией заливки в нужную точку получится ?

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



Название: Re: Рисовать миллиметровку
Отправлено: GreatSnake от Февраль 15, 2011, 15:25
Цитировать
попасть линией заливки в нужную точку получится ?
Что такое "линия заливки"?


Название: Re: Рисовать миллиметровку
Отправлено: ltise от Февраль 15, 2011, 16:06
Цитировать
попасть линией заливки в нужную точку получится ?
Что такое "линия заливки"?
Линия миллиметровки в заливке, например вертикальная линия, соответствующая точке "0"


Название: Re: Рисовать миллиметровку
Отправлено: GreatSnake от Февраль 15, 2011, 16:11
Хм, вы знаете что такое тайлы?


Название: Re: Рисовать миллиметровку
Отправлено: ltise от Февраль 15, 2011, 16:41
Хм, вы знаете что такое тайлы?
Сорри, тайлы или файлы ?


Название: Re: Рисовать миллиметровку
Отправлено: GreatSnake от Февраль 15, 2011, 16:44
тайлы, конечно. А вы можете заливать содержимое окна файлами?  :)


Название: Re: Рисовать миллиметровку
Отправлено: ltise от Февраль 15, 2011, 17:00
тайлы, конечно. А вы можете заливать содержимое окна файлами?  :)
Конечно могу  - могу растровыми файлами могу векторами или и теми и другими, на крайняк можно текстом залить, любой может :)
Одним словом - Вы предлагаете считать для миллиметровки минимальный растровый примитив (tile) и использовать его в заливке ? при изменении масштаба, соотв. пересчитывать новый...
попробую


Название: Re: Рисовать миллиметровку
Отправлено: xokc от Февраль 15, 2011, 20:42
На Delphi рисовал линиями по битмапу и потом битмап на экран - проблем с производительностью не было никаких и никогда. Скроллинг делал с помощью штатных scrollUp, scrollDown, scrollLeft, scrollRight. В Qt именно сетку рисовать не пробовал, но битмапы тоже выводятся ну очень быстро. Короче, проще попробовать и посмотреть.


Название: Re: Рисовать миллиметровку
Отправлено: kamre от Февраль 16, 2011, 03:37
Скроллинг делал с помощью штатных scrollUp, scrollDown, scrollLeft, scrollRight.
Да со скролингом то понятно, а вот как zoom делать быстро?


Название: Re: Рисовать миллиметровку
Отправлено: kdm от Февраль 16, 2011, 10:28
Может я тут везде глупости пишу, но в paintEvent (QPaintEvent*) в QPaintEvent если в region хранится локальный регион который стал invalid нуждается в перерисовки и вычислять учитывая шаг, зум, перерисовывать конкретный регион вычислив смещение и также рисовать сетку. Тоже как-то заморачивался с сеткой только в QGLWidget. Рисовать надо было не во всю область а только под смещение.