Russian Qt Forum
Ноябрь 24, 2024, 21:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Мини-навигатор  (Прочитано 8163 раз)
Khs
Гость
« : Март 19, 2009, 13:36 »

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

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

Спасибо!
Записан
_OLEGator_
Гость
« Ответ #1 : Март 19, 2009, 19:23 »

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

придется связывать свой навигатор и карту, чтобы ловить изменение размеров и перемещений.
Записан
Khs
Гость
« Ответ #2 : Март 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() навигатора?
Записан
xaaw
Гость
« Ответ #3 : Март 23, 2009, 22:18 »

Взаимосвязь между навигатором и основным QGraphicsView лучше делать через setSceneRect()
а  foreground  переопределить так чтобы он отрисовывал sceneRect.Таким образом при изменении sceneRect будет происходить перерисовка как в основном окне так и в навигаторе.
A скролы необходимо будет привязать к sceneRect();
Записан
Khs
Гость
« Ответ #4 : Март 23, 2009, 22:46 »

неа, через сцену не совсем правильно это делать, точнее вообще не в ту степь. Решил вопрос, если что потом выложу Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Март 24, 2009, 12:45 »

Сам как-то делал подобное, правда, навигатор у меня был отдельным виджетом с собственной отрисовкой.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Khs
Гость
« Ответ #6 : Март 25, 2009, 12:36 »

Вот, то, что получилось))
Записан
spirit
Гость
« Ответ #7 : Март 25, 2009, 12:39 »

куль!  Подмигивающий
Записан
AntonUfo
Гость
« Ответ #8 : Февраль 01, 2010, 12:09 »

Вот, то, что получилось))

Если делать не через сцену то как правильно, ков механизм ?
Записан
mal
Гость
« Ответ #9 : Февраль 08, 2010, 17:28 »

делал такое - две сцены  - два вью и никаких проблем с блокировкой айтемов
Записан
AntonUfo
Гость
« Ответ #10 : Февраль 08, 2010, 21:12 »

да я то же уже сделал, одна сцена два вью.. + стгналы и слоты... в общем через одно место походу...  вроде работает.... но чувствую что можно было как то более прямее что ли..., вообще у меня проблема какая то прога все больше, все серьезней но както запутанно все более и более получается, нет культуры программирования что ли....
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.137 секунд. Запросов: 23.