#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) имеет большое значение.