Для некоторых приложений с графическим интерфейсом я использую 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);
}