QGraphicsItem и порядок вкладок - PullRequest
1 голос
/ 06 мая 2011

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

QGraphicsPolygonItem
QGraphicsTextItem
QGraphicsRectItem

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

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

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

SetTabOrder работал только с 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 && is_focus_next )
            {
                item->setFocus( Qt::MouseFocusReason );
//                item->setSelected( true );
                is_focus_next  = false;
                break;
            }

  // searching for selected item 
            if( current && 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 && is_focus_next )
            {
                item->setFocus( Qt::MouseFocusReason );
                return true;
            }

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

    }

return QGraphicsView::focusNextPrevChild(next);
}

1 Ответ

1 голос
/ 06 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...