Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Khs от Март 19, 2009, 13:36



Название: Мини-навигатор
Отправлено: Khs от Март 19, 2009, 13:36
Привет!
Имеется: QGraphicsView/Scene с неким содержимым.
Необходимо: Сделать мини-навигатор для имеющейся QGraphicsView, (обычно такие делаются в мап-сервисах), тоесть в QGraphicsView идет отображение участка карты попадающего в область просмотра, а в мини-навигаторе отображена вся карта и прямоугольник, показывающий область просмотра в QGraphicsView. При этом при нажатии на мини-навигатор, айтемы сцены двигаться не должны, и область просмотра QGraphicsView должна перемещаться в точку нажатия в навигаторе и, соответственно прямоугольник на навигаторе тоже.

По сути, этот мини-навигатор также можно реализовать через QGraphicsView привязанный к этой сцене. Только тут есть некоторые вопросы.
Если делать setInteractive(false) у навигатора ("any mouse or key events are ignored", чтобы нельзя было двигать айтемы), как потом получать события мыши для сдвига области в навигаторе.
Как лучше сделать взаимосвязь для отрисовки прямоугольника в навигаторе.

Спасибо!


Название: Re: Мини-навигатор
Отправлено: _OLEGator_ от Март 19, 2009, 19:23
Наследуй QGraphicsView
 1) Для отрисовки видимой области переопредели QGraphicsView::drawForeground ( QPainter * painter, const QRectF & rect )
 2) При нажатии на навигаторе пересчитывать координаты и вызвать у карты QGraphicsView::centerOn ( const QPointF & pos )
 3) Чтобы не давать двигать элементы сцены надо заблокировать события мыши у своего навигатора, вроде бы так...

придется связывать свой навигатор и карту, чтобы ловить изменение размеров и перемещений.


Название: Re: Мини-навигатор
Отправлено: Khs от Март 20, 2009, 13:53
Наследуй QGraphicsView
 1) Для отрисовки видимой области переопредели QGraphicsView::drawForeground ( QPainter * painter, const QRectF & rect )
 2) При нажатии на навигаторе пересчитывать координаты и вызвать у карты QGraphicsView::centerOn ( const QPointF & pos )
 3) Чтобы не давать двигать элементы сцены надо заблокировать события мыши у своего навигатора, вроде бы так...

придется связывать свой навигатор и карту, чтобы ловить изменение размеров и перемещений.

2 и 3 сделал, а вот с 1м есть вопросец. Отрисовываю в drawForeground прямоугольник нормально, тоесть он соответствует области QGraphicsView основного. Я так понимаю drawForeground происходит при вызове viewport()->update() или я ошибаюсь? Тоесть когда делаешь ресайз виджета на котором находится навигатор, то происходит вызов drawForeground и прямоугольник перерисовывается с новыми позициями QGraphicsView, а как сделать вызов перерисовки при прокрутке скроллов QGraphicsView? Переопределять наследованные ф-и от QAbstractScrollArea и там вызывать viewport()->update() навигатора?


Название: Re: Мини-навигатор
Отправлено: xaaw от Март 23, 2009, 22:18
Взаимосвязь между навигатором и основным QGraphicsView лучше делать через setSceneRect()
а  foreground  переопределить так чтобы он отрисовывал sceneRect.Таким образом при изменении sceneRect будет происходить перерисовка как в основном окне так и в навигаторе.
A скролы необходимо будет привязать к sceneRect();


Название: Re: Мини-навигатор
Отправлено: Khs от Март 23, 2009, 22:46
неа, через сцену не совсем правильно это делать, точнее вообще не в ту степь. Решил вопрос, если что потом выложу :)


Название: Re: Мини-навигатор
Отправлено: Racheengel от Март 24, 2009, 12:45
Сам как-то делал подобное, правда, навигатор у меня был отдельным виджетом с собственной отрисовкой.


Название: Re: Мини-навигатор
Отправлено: Khs от Март 25, 2009, 12:36
Вот, то, что получилось))


Название: Re: Мини-навигатор
Отправлено: spirit от Март 25, 2009, 12:39
куль!  ;)


Название: Re: Мини-навигатор
Отправлено: AntonUfo от Февраль 01, 2010, 12:09
Вот, то, что получилось))

Если делать не через сцену то как правильно, ков механизм ?


Название: Re: Мини-навигатор
Отправлено: mal от Февраль 08, 2010, 17:28
делал такое - две сцены  - два вью и никаких проблем с блокировкой айтемов


Название: Re: Мини-навигатор
Отправлено: AntonUfo от Февраль 08, 2010, 21:12
да я то же уже сделал, одна сцена два вью.. + стгналы и слоты... в общем через одно место походу...  вроде работает.... но чувствую что можно было как то более прямее что ли..., вообще у меня проблема какая то прога все больше, все серьезней но както запутанно все более и более получается, нет культуры программирования что ли....