Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Barmaglodd от Август 12, 2009, 20:19



Название: QGraphicsView и векторная графика
Отправлено: Barmaglodd от Август 12, 2009, 20:19
Задача простая, нарисовать карту, с возможностью масштабирования и выбора объектов. Карта задана набором векторных объектов с атрибутами. Сразу скажу про QGis и т.д. и т.п. знаю, цель была сделать более лёгкий вариант. Решил использовать QGraphicsView, в документации всё очень красиво расписано, но сразу получил удар граблями :(
1. При масштабировании, масштабируется всё: размеры линий, рисунки кистей, текст. Ладно, для точек и подписей придумал костыль, делаю верхний QGraphicsItem, который ничего не рисует, и дочерние, которые игнорируют трансформации родителя. Я так понял, это законный костыль, т.к. в комментариях к ItemIgnoresTransformations приводится пример с не масштабируемым текстом. Но остаётся вопрос с толшиной линий и штриховкой. Единственное, что приходит в голову, в наследоваться от QGraphicsItem, сбрасывать матрицу преобразований у painter'а, перерасчитывать координаты и рисовать. Это явный перебор. :(
2. Выделение тормозит. У меня сотни тысяч объектов с перекрывающимися boundingBox'ами. Плюс счастие в виде косяка, описанного в теме http://www.prog.org.ru/topic_9063_0.html (http://www.prog.org.ru/topic_9063_0.html).
3. Глюк с перерисовкой штриховки при масштабировании. На определённых масштабах сцена выглядит будто шахматная доска, вся разделена на квадраты, в одних есть штриховка, в других нет.
4. Нет штатного способа подгружать геометрию по запросу. Хочется полноценного MVC, а не пихать всю геометрию в память.
Почему в документации пишут про 2D, когда по факту это растровое полотно с глюками, Я ещё удивлялся, почему в QGis все слои рендерятся в картинки, и всё выделение руками реализовано.
Извините за сумбур :)


Название: Re: QGraphicsView и векторная графика
Отправлено: Igors от Август 12, 2009, 20:57
.org.ru/topic_9063_0.html[/url].
3. Глюк с перерисовкой штриховки при масштабировании. На определённых масштабах сцена выглядит будто шахматная доска, вся разделена на квадраты, в одних есть штриховка, в других нет.
Ну, вообще-то это называется "anti-alias"  :) И обеспечить его - работа кропотливая, никто за Вас это делать не будет. Так что при всем уважении - Ваши претензии не по адресу, любой пакет дает tools, а не готовые решения.


Название: Re: QGraphicsView и векторная графика
Отправлено: BlackTass от Август 13, 2009, 03:29
По сути это реально слишком узкая задача и тут нужен большой кастом, и QGraphicsFramework еще молодой и быстро развивающийся, естественно он еще не вылизан до конца.


Название: Re: QGraphicsView и векторная графика
Отправлено: Barmaglodd от Август 13, 2009, 04:59
.org.ru/topic_9063_0.html[/url].
3. Глюк с перерисовкой штриховки при масштабировании. На определённых масштабах сцена выглядит будто шахматная доска, вся разделена на квадраты, в одних есть штриховка, в других нет.
Ну, вообще-то это называется "anti-alias"  :) И обеспечить его - работа кропотливая, никто за Вас это делать не будет. Так что при всем уважении - Ваши претензии не по адресу, любой пакет дает tools, а не готовые решения.
Может плохо объяснил :( Баг имеет место и при включеном антиальясинге и без него. Часть полигона заливается белым, а часть заданной штриховкой, причём, если увеличить сцену, заливается весь полигон. Этот косяк следствие первой проблемы. Полигоны залиты стилем Qt::Dense5Pattern, который предстваляет собой чередование прозрачных и закрашенных пикселей. Я уменьшаю в кратное 2 число раз,  появляются артефакты. Сейчас вспомнил, что где-то в qtblogs был пост на эту тему.


Название: Re: QGraphicsView и векторная графика
Отправлено: Barmaglodd от Август 13, 2009, 06:25
По сути это реально слишком узкая задача и тут нужен большой кастом, и QGraphicsFramework еще молодой и быстро развивающийся, естественно он еще не вылизан до конца.
На самом деле задача простая. Проблема в том, что GV все трансформации применяет к QPainter, а не к объектам сцены. Т.е. все трансформации над растром, а не над вектором.


Название: Re: QGraphicsView и векторная графика
Отправлено: Barmaglodd от Август 13, 2009, 06:28
6. Несколько перекрывающихся объектов, кликаю мышкой в область пересечения, выделяется верхний, кликаю второй раз, остаётся старое выделение, а хочется, чтоб следующий выделился. И это руками надо делать. :( Видимо я слишком многого хочу.


Название: Re: QGraphicsView и векторная графика
Отправлено: BlackTass от Август 13, 2009, 08:24
А пробовали троллям писать? может что и подскажут дельного, но мне все таки кажется что такие вещи надо действительно писать самому.


Название: Re: QGraphicsView и векторная графика
Отправлено: fuCtor от Август 20, 2009, 18:10
Делал аналогично отрисовку карты. Делал разные варинты отрисовки, в том числе и на итемах, на итемах не устроил по скорости. В итоге остановился на отрисовке в буфер. Скорость вполне достойная в районе 30 -40 мс на кадр. Все операции над геометриями через деревья (поиск из 16тыс объектов занимает 0.8 мсек в среднем). Все координаты пересчитываю вручную. Для этого всего даже написан свой фреймворк (для использования внутри компании). Так что попробуйте пересмотреть архитектуру.


Название: Re: QGraphicsView и векторная графика
Отправлено: Barmaglodd от Август 21, 2009, 08:23
Уже всё переписал. Отказался от GraphicsView, отрисовываю в промежуточный буфер. Пространственный индекс через OGR и GEOS. Все трансформации вручную. Самое узкое место - сеть, в остальном доволен :)


Название: Re: QGraphicsView и векторная графика
Отправлено: Khs от Август 21, 2009, 09:44
пополните qt фрэймворк своими разработками в сфере векторной графики/картостроения :)


Название: Re: QGraphicsView и векторная графика
Отправлено: kUSER от Октябрь 14, 2009, 09:06
Здравствуйте, у меня сейчас возникла подобная задача. Я пробую решить ее с помощью QSvgWidget (сейчас копаю пример SvgView), но кажется пошел не в ту сторону. Скажите, не могли бы Вы сказать как Вы решили проблему?
Может быть показали бы исходники  ::) Заранее спасибо.


Название: Re: QGraphicsView и векторная графика
Отправлено: Barmaglodd от Октябрь 15, 2009, 08:31
Всё сильно завязано на OGR и мои вспомогательные классы, а если это выдрать, то почти ничего и не останется :)