2013-06-19 2 views
3

У меня есть QGraphicsScene где я вставка различного QGraphicsItem объектов, такие как прямоугольники или многоугольники. Идея состоит в представлении электронной диаграммы с RectItem для каждого компонента, треугольной формы PolygonItem для каждого штыря этого компонента и PathItem для представления связей между контактами.Qt: изменение Z-порядка между двумя не родственными графическими элементами

Мне сложно найти способ правильно упорядочить мои предметы, чтобы ссылки всегда прятались от их штыря и штифта. Легко скрыть ссылку за ее начальным знаком, потому что начальный вывод всегда является родителем ссылки, поэтому я могу установить флаг QGraphicsItem :: ItemStacksBehindParent, когда создаю ссылку. Но для концевого штифта я застрял.

Я попытался установить Zvalue моего вывода на превосходное значение ссылки, к которой он присоединен, или вызвать функцию Qt StackBefore(), но без результата. Документ говорит мне, что z-order касается только элементов-близнецов, которые означают элемент, который имеет один и тот же родительский элемент или оба являются элементами верхнего уровня. Но все мои компоненты независимы, так есть ли способ изменить порядок стека между двумя не-братьями?

Большое спасибо за помощь.

+0

Возможно, вам следует вычислить z-индекс каждого элемента вручную с помощью некоторого пользовательского алгоритма, а затем просто использовать 'QGraphicsItem :: setZValue'? –

+0

@ Riateche Вы имеете в виду что-то подобное? '/ ** * Добавить данную ссылку в список прикрепленных ссылок (если он уже не был добавлен ранее) * @param л ссылку добавить */ недействительным Pin :: AddLink (Link * л) { если (! MLinks.contains (l)) { mLinks.добавление (л); если (l-> zValue()> = zValue()) setZValue (l-> zValue() + 1); } } ' Потому что это то, что я раньше имел, но также и одно из решений, которые не работали по причине, упомянутой ранее. – Arnaud

+0

Вы сказали, что все ваши компоненты независимы, так же как и все элементы верхнего уровня? В этом случае 'setZValue' должен работать. –

ответ

1

Хорошо, основываясь на комментариях Riateche (спасибо), я смог найти решение моей проблемы.

Чтобы изменить порядок укладки между двумя элементами, не принадлежащими родственнику, и поскольку у них нет общих родителей, мне пришлось изменить значение z их самого верхнего родителя, то есть тех, которые являются элементами верхнего уровня. Вместо того, чтобы пытаться скрыть ссылку за ее концевым штырем, я создал весь компонент, который содержит штырь, который испускает мою ссылку, скрывается за другим компонентом, который является родительским концом вывода. Поскольку эти два компонента являются элементами верхнего уровня, работает метод setZValue.

Ну, я согласен с тем, что на самом деле он не отвечает на исходный вопрос, потому что в конце концов мне пришлось переосмыслить проблему, чтобы использовать два элемента sibling/top-levels, но это похоже на естественный способ сделать вещи, поэтому ... Я не думаю, что существует действительно способ изменить порядок стека между двумя непоследовательными элементами.

0

Предлагаю создать ссылки без родителя.
Затем используйте один нижний (диапазон) z-index для всех ссылок и один более высокий (диапазон) для всех компонентов.
Таким образом, укладка всегда правильная, и вы безопасны для случая, когда на диаграмме есть цикл (например, обратная связь).

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