Порядок вставки QGraphicsItem

#c #qt #qt4 #qgraphicsitem

#c #qt #qt4 #qgraphicsitem

Вопрос:

У меня есть проект, который использует QGraphicScene QGraphicsView для организации QGraphicsItem. Все графические элементы можно перемещать и выбирать.

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

Из документации Qt:

По умолчанию все родственные элементы укладываются в стопку в соответствии с порядком вставки (т. Е. первый добавляемый элемент рисуется перед следующим добавляемым элементом). Если значения Z двух элементов отличаются, то элемент > с наибольшим значением Z отображается сверху. Когда значения Z совпадают, порядок вставки > порядок будет определять порядок укладки.

Вопрос, как изменить порядок вставки графических элементов?

Я пытаюсь создать подкласс mousePressEvent для QGraphicsView и изменить порядок вставки с помощью метода stackBefore(). Если все элементы смешаны вместе и перекрывают друг друга, нужно сделать много кликов, чтобы выбрать нужный элемент.

 void View::mousePressEvent ( QMouseEvent * event )
{

MyGraphicsGroup *last = 0;
QGraphicsItem *first = 0;
foreach( QGraphicsItem *item, items(event->pos()) )
{
    if( !first ) first = item;

    if( item->flags() amp; QGraphicsItem::ItemIsSelectable )
    {
        last = qgraphicsitem_cast<MyGraphicsGroup*>(item);
    }
}

if( last )
{
    first->stackBefore(last);
}

inherited::mousePressEvent( event );
}
  

Ответ №1:

только что найдено в документе:

«Порядок размещения элементов можно задать, вызвав setZValue()»

Надеюсь, это поможет.

Комментарии:

1. Да, я могу использовать item-> setZValue( i), но у меня есть дополнительный элемент управления QGraphicsWidget поверх QGraphicsItem с ZValue = 2, поэтому мне нужна дополнительная сложная логика для элементов и виджетов с ZValue.

2. У меня точно такая же проблема, как и у вас, и я также хочу зарезервировать функциональность zValue для другой цели.