Название: Мини-навигатор Отправлено: 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 да я то же уже сделал, одна сцена два вью.. + стгналы и слоты... в общем через одно место походу... вроде работает.... но чувствую что можно было как то более прямее что ли..., вообще у меня проблема какая то прога все больше, все серьезней но както запутанно все более и более получается, нет культуры программирования что ли....
|