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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Создание "легенды" на карте  (Прочитано 18339 раз)
developer-nsk
Гость
« : Октябрь 06, 2009, 12:31 »

Господа, вот в чём суть проблемы - есть некая карта (QGraphicsScene), которая отображается в QGraphicsView. Соответственно, эту карту можно вращать и т.д. Каким образом можно добавить на QGraphicsView виджет, который будет не подвержен трансформации? Т.е. необходимо сделать линейку изменения масштаба, компас примерно как в maps.google.ru, а также "легенду", которые будут постоянно отображаться не зависимо от состояния сцены. Искал в инете примеры - не нашёл. Заранее благодарен!
Записан
Khs
Гость
« Ответ #1 : Октябрь 06, 2009, 12:41 »

Может быть добавить свой виджет с парентом QGraphicsView. Либо сделать свои айтемы сцены с флагами *без трансформации*, но это не есть гуд - доп нагрузка на сцену + перемещать их при перемещеннии контента карты.
Записан
developer-nsk
Гость
« Ответ #2 : Октябрь 06, 2009, 12:47 »

Второй вариант уже пытался сделать - вообще не айс получается... Карта и так загружена айтемами, поэтому с перемещениями никак не получится. Делают же люди как-то легенды для всяких диаграмм :-) Вот мне что-то типа этого надо...
Записан
Khs
Гость
« Ответ #3 : Октябрь 06, 2009, 12:56 »

Ну потому я и написал что вариант с айтемами не айс))
А что тебе не нравится 1й вариант?
Люди то делают, но они же не обязательно используют QGraphicsView-Scene Улыбающийся
Записан
developer-nsk
Гость
« Ответ #4 : Октябрь 06, 2009, 13:01 »

Спору нет, не обязательно... Просто лично я ещё не супер-ас в Qt, поэтому первый вариант слабо себе представляю, каким образом это можно сделать... Сейчас у меня мысли такие - создать QGraphicsItem для масштаба, для компаса и т.д. Причём не важно, кто у них будет парентом. Что дальше делать - не знаю, бьюсь уже дня два...
Записан
ufna
Гость
« Ответ #5 : Октябрь 06, 2009, 13:07 »

вообще, можно пойти классическим путем, "компьютерных игрушек" - рисуй поверх графикс вью.
Записан
developer-nsk
Гость
« Ответ #6 : Октябрь 06, 2009, 13:10 »

Спасибо за ответ, но есть ли какой-нибудь пример? Ибо как это делается конкретно в Qt - не до конца себе представляю по причине небольшого опыта в Qt...
Записан
ufna
Гость
« Ответ #7 : Октябрь 06, 2009, 13:33 »

что за легенда у тебя будет? Какие виджеты ты хочешь сделать? Какая у них степень взаимодействия с пользователем?
Записан
Barmaglodd
Гость
« Ответ #8 : Октябрь 06, 2009, 13:51 »

что за легенда у тебя будет? Какие виджеты ты хочешь сделать? Какая у них степень взаимодействия с пользователем?
Вот не пофиг?

Если не хочешь использовать не трансформируемые QGraphicsItem'ы, делай свои виджеты. Перегрузи paintEvent,  нарисуй линейку, компас, всё, что хочешь. Я сам так делаю для отображения выделения и редактирования объектов на карте.

Код:
#include <QWidget>

class MapView;

class CreatePolyLineTool : public QWidget
{
Q_OBJECT

protected:
void paintEvent(QPaintEvent* ev);
bool eventFilter(QObject *obj, QEvent *ev);
public:
CreatePolyLineTool(QWidget* parent);
};

Код:
#include "CreatePolyLineTool.h"
#include <QPainter>

CreatePolyLineTool::CreatePolyLineTool(QWidget*parent)
: QWidget(parent)
{
resize(parent->size());
parent->installEventFilter(this);
}


void CreatePolyLineTool::paintEvent(QPaintEvent* ev)
{
QPainter painter(this);
//Рисуем, что хотим
// painter.drawPolyline(_polygon);
}

bool CreatePolyLineTool::eventFilter(QObject* obj, QEvent* ev)
{
if(obj==parentWidget() && ev->type()==QEvent::Resize)
resize(parentWidget()->size());
return false;
}

« Последнее редактирование: Октябрь 06, 2009, 13:57 от Barmaglodd » Записан
developer-nsk
Гость
« Ответ #9 : Октябрь 06, 2009, 14:20 »

что за легенда у тебя будет? Какие виджеты ты хочешь сделать? Какая у них степень взаимодействия с пользователем?

Степень взаимодействия с пользователем разная - от никакой (например, линейка, которая показывает текущий масштаб в метрах) до изменения масштаба... В общем, можно в гуглмапс увидеть часть того, что надо :-)
Записан
developer-nsk
Гость
« Ответ #10 : Октябрь 06, 2009, 14:36 »

что за легенда у тебя будет? Какие виджеты ты хочешь сделать? Какая у них степень взаимодействия с пользователем?
Вот не пофиг?

Если не хочешь использовать не трансформируемые QGraphicsItem'ы, делай свои виджеты. Перегрузи paintEvent,  нарисуй линейку, компас, всё, что хочешь. Я сам так делаю для отображения выделения и редактирования объектов на карте.


Спасибо большое! Вот это уже похоже на то, что нужно! Только не перехватывал бы ещё этот виджет wheelEvent у QGraphicsView, было бы вообще классно... :-)
Записан
Barmaglodd
Гость
« Ответ #11 : Октябрь 07, 2009, 08:07 »

Код:
void CreatePolyLineTool::wheelEvent ( QWheelEvent * event ) 
{
     event->ignore();
}

Хотя у меня и без этого не перехватывается. Может parent выставлен не на QGraphicsView?
« Последнее редактирование: Октябрь 07, 2009, 08:09 от Barmaglodd » Записан
developer-nsk
Гость
« Ответ #12 : Октябрь 12, 2009, 17:20 »

Код:
void CreatePolyLineTool::wheelEvent ( QWheelEvent * event ) 
{
     event->ignore();
}

Хотя у меня и без этого не перехватывается. Может parent выставлен не на QGraphicsView?

Нет, parent точно выставлен на QGraphicsView, а вот предложенное Вами решение помогло. Спасибо большое!
Записан
mell
Гость
« Ответ #13 : Октябрь 18, 2009, 15:14 »

что-то у меня пример Barmaglodd-а мало того, что перехватывает wheelEvent у QGraphicsView, так и мышь полностью не работоспособна в QGraphiscScene... может есть у кого примеры поподробнее?
Записан
Barmaglodd
Гость
« Ответ #14 : Октябрь 18, 2009, 15:32 »

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


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