QGraphicsItem и порядок табуляции

#c #qt #qt4

#c #qt #qt4

Вопрос:

Для некоторых приложений с графическим интерфейсом я использую QMainWindow с различными элементами управления на нем: QGraphicScene QGraphicsView, QPushButtons, QWidget. Внутри QGraphicsScene расположено множество элементов разного типа:

 QGraphicsPolygonItem
QGraphicsTextItem
QGraphicsRectItem
  

Но для меня наиболее важным является элемент Polygon, у этого элемента есть эти флаги:

 setFlag(QGraphicsItem::ItemIsFocusable, true);
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true);
  

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

Настройка порядка работала только с QGraphicsObjects. Я пытался решить эту проблему с помощью переопределения QGraphicsView::focusNextPrevChild

 bool MyGraphicsView::focusNextPrevChild( bool next )
{
    QGraphicsPolygonItem *target;
    QGraphicsPolygonItem *current;

    if( scene()->focusItem() )
    {
        target = qgraphicsitem_cast<QGraphicsPolygonItem*>( scene()->focusItem() );

        bool is_focus_next=false;
        foreach( QGraphicsItem *item, scene()->items() )
        {
            current = qgraphicsitem_cast<QGraphicsPolygonItem*>( item );

  // set focus for next before selected
            if( current amp;amp; is_focus_next )
            {
                item->setFocus( Qt::MouseFocusReason );
//                item->setSelected( true );
                is_focus_next  = false;
                break;
            }

  // searching for selected item 
            if( current amp;amp; current == target )
            {
                is_focus_next = true;
            }
        }

    }
}
  

Но сработала только первая вкладка, когда я снова нажал Tab, фокус переместился на другой QWidget за пределами элемента управления QGraphicsView.
Пожалуйста, не могли бы вы помочь мне с фокусом порядка табуляции для QGraphicsItem.

Спасибо

РЕДАКТИРОВАТЬ: окончательная версия, спасибо Штеффену.

 bool MyGraphicsView::focusNextPrevChild( bool next )
{
    QGraphicsPolygonItem *target;
    QGraphicsPolygonItem *current;

    if( scene()->focusItem() )
    {
        target = qgraphicsitem_cast<QGraphicsPolygonItem*>( scene()->focusItem() );

        bool is_focus_next=false;
        foreach( QGraphicsItem *item, scene()->items() )
        {
            current = qgraphicsitem_cast<QGraphicsPolygonItem*>( item );

  // set focus for next before selected
            if( current amp;amp; is_focus_next )
            {
                item->setFocus( Qt::MouseFocusReason );
                return true;
            }

  // searching for selected item 
            if( current amp;amp; current == target )
            {
                is_focus_next = true;
            }
        }

    }

return QGraphicsView::focusNextPrevChild(next);
}
  

Ответ №1:

Вы должны вернуться true , чтобы указать, что вы действительно нашли виджет. Поскольку на данный момент у вас вообще нет инструкции return, поведение не определено. Вы также можете добавить некоторую логику для возврата false к последнему элементу, чтобы позволить пользователю снова покинуть ваш QGraphicsView . Смотрите также документацию для QWidget::focusNextPrevChild().

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

1. Спасибо, эта небольшая ошибка (возвращает true или false) имеет большое значение.