2013-08-06 4 views
2

У меня есть QGraphicsView для виджета, в который я добавляю несколько элементов.Как масштабировать QGraphicsEllipseItem с уровнем масштабирования QGraphicsView

некоторые из них являются многоугольниками и некоторые эллипсы (оба QGraphicsItems), когда я увеличить Графический просмотр

void Test::on_verticalSlider_sliderMoved(int position) 
{ 
    ui->graphicsView->scale(1.1,1.1); 
} 

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

не знаю, что это облегчает, но все точек эллипса, построенных в любой момент, находятся в пределах одной и той же QGraphicsItemGroup, поэтому может быть флаг, который я могу установить на entir чтобы сделать это?

в любом случае я бы признателен за любую помощь с этим

благодаря

EDIT ------ КОД ОБРАЗЦА

элемент является QGraphicsEllipseItem и m_group_point является QGraphicsItemGroup

item->setParentItem(m_group_point.get()); 

затем я добавляю группу в сцену

m_scene2->addItem(m_group_point.get()); 

затем добавить эту сцену в представлении

ui->graphicsView->setScene(m_scene2.get()); 

.get они, потому что они являются общими для указателей

ответ

2

ну, игнорировать трансформацию действительно правильный путь.

QGraphicsItem :: ItemIgnoresTransformations: Элемент игнорирует наследуемые преобразования (т.е. его позиция по-прежнему связана с его родителем, но родитель или вид вращение, масштабирование или обрезание игнорируются). Этот флаг полезен для сохранения элементов текстовой метки в горизонтальном и немасштабированном виде, поэтому они будут доступны для чтения, если представление будет преобразовано. Когда установлено, геометрия представления объекта и геометрия сцены будут поддерживаться отдельно. Вы должны вызвать deviceTransform() для сопоставления координат и обнаружения коллизий в представлении. По умолчанию этот флаг отключен. Этот флаг был введен в Qt 4.3.

О пребывании в середине, вы должны двигаться эллипсы в сцены в правильном положении, поэтому они имеют надлежащей координаты сцены, а затем поручить игнорировать преобразование зрения, так что они будут игнорировать любые изменения масштаба/поворота/etc, как указано в документации.

+0

ОК я добавляю каждый элемент в группу, а затем добавляю группу в сцену в качестве элемента, а затем добавляю сцену в представление, чтобы отобразить ее. так что вы имеете в виду «переместить эллипсы внутри сцены в правильное положение»? – AngryDuck

+0

вы можете скопировать-вставить немного кода, где вы фактически создаете эллипсы и их группу. может быть псевдокодом для простоты – evilruff

+0

OK добавил некоторые, приветствия – AngryDuck

1

Попробуйте установить флаг ItemIgnoresTransformations на объекты, которые вы хотите сохранить постоянного размера.

+0

Да, я пробовал это, если я это сделаю, тогда они не замышляют в правильном месте, чтобы начать с них, просто они все скопляются посередине, а не замышляют, где они должны быть, но они сохраняют свой размер при масштабировании, но не будут вызовите это решение еще – AngryDuck

2

в Qt документации говорит об этом о флаге QGraphicsItem :: ItemIgnoresTransformations: -

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

Это то, что вы хотите. Вы добавили свои объекты в QGraphcisItemGroup. Для этого, Qt состояния помогают: -

QGraphicsItemGroup игнорирует флаг ItemIgnoresTransformations на его детей (то есть, по отношению к геометрии элемента группы, то дети рассматриваются как если бы они были трансформируемые).

Чтение в этом, QGraphicsItem использует флаг ItemIgnoreTransformations, основанный на его родителей, в вашем случае является QGraphicsGroup, но этот класс игнорирует флаг на своих детей, которые, вероятно, будет причиной проблемы, которую вы видя.

Поэтому не устанавливайте флаг в родительской группе, а на ее дочерних элементах.

+0

Спасибо, оказывается, что мне нужно было установить флаги на элемент не для всей группы, теперь iv сделал, что он работает как ожидалось. – AngryDuck

Смежные вопросы