2014-04-06 3 views
2

Я хотел бы нарисовать точку или точку или точку GraphicsView, что:Как создать точку произвольного размера в QGraphicsView Qt?

  • имеет произвольный размер, который работает как радиус окружности,

  • зависит от масштабных преобразований в том, что его положение изменяется в соответствии с текущей шкалой,

  • , но его произвольный размер НЕ зависит от масштабирования.

Проблема, которую я специально решаю, изображает небесные тела в визуализаторе солнечной системы. Я хочу делать вещи с надлежащим расстоянием друг от друга, но пространство невообразимо пустым - попытка изобразить объект размером с Землю с правильным радиусом сделает очень трудным для зрителя фактически увидеть что-либо, если пользователь уменьшит его до см. другие планеты. Поэтому я хотел бы отметить местоположения точками, которые не масштабируются в диаметре, а все остальное (например, орбитальные пути, расстояния) масштабируется.

Я попытался использовать ItemIgnoresTranformations, но это заставляет объект игнорировать изменения размера и изменения местоположения при изменении масштаба. Я хочу, чтобы объект был заметен независимо от масштаба, но в то же время для того, чтобы он был на своем месте.

Альтернативные решения приветствуются.

EDIT1:

Новый код выглядит так:

ellipse2 = scene->addEllipse(0, 0, body.radius,body.radius,blackPen,greenBrush); 
ellipse2->setFlag(QGraphicsItem::ItemIgnoresTransformations); 
ellipse2->setPos(system.starX+body.getX(date2days(game.date))-body.radius/2.0, 
       system.starY+body.getY(date2days(game.date))-body.radius/2.0); 

Раньше позиция была просто положить в место на 0s в вызове addElipse(). Однако есть проблема - движения планет не совсем соответствуют построенным траекториям орбиты (в настоящее время я упрощаю идеальные круги с постоянной угловой скоростью, а не эллиптические пути с переменной угловой скоростью). Фактические пути, по-видимому, сдвинуты на неизвестную (но зависящую от масштаба) величину в направлении вверху слева.

Вот как это выглядит unzoomed:
Before
А вот как это выглядит увеличенной:
After

Эта проблема не возникает, если элемент зависит от преобразований. Что дает?

+1

'QGraphicsItem :: ItemIgnoresTransformations' должен делать именно то, что вы хотите. Проблема может заключаться в том, как вы добавляете свои элементы в сцену. См. [This] (http://stackoverflow.com/questions/20125130/fixed-size-qgraphicsitems-in-multiple-views) вопрос. – thuga

+0

Спасибо! Это помогло, но результат все еще не совсем корректен. Я редактировал с объяснением. Мне кажется, что проблема может быть в body.radius - но как определить текущий масштаб для его масштабирования? –

+0

Нашли ошибку и разместите решение. –

ответ

2

Обнаружена проблема. Мне нужно было приспособиться к радиусу планет в прямоугольнике, а не в позиции.

Правильный код для этого выглядит следующим образом:

ellipse2 = scene->addEllipse(-body.radius/2, 
          -body.radius/2, 
          body.radius,body.radius,blackPen,greenBrush); 
ellipse2->setFlag(QGraphicsItem::ItemIgnoresTransformations); 
ellipse2->setPos(system.starX+body.getX(date2days(game.date)), 
       system.starY+body.getY(date2days(game.date))); 
Смежные вопросы