对于某些GUI应用程序,我使用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工作,当我按Tab键时,焦点已经移动到QGraphicsView控件之外的其他QWidget。 请你帮我看一下QGraphicsItem的Tab顺序焦点。
谢谢
编辑:最终版本,感谢Steffen。
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);
}
答案 0 :(得分:1)
您应该返回true
以表明您确实找到了一个小部件。由于目前根本没有返回语句,因此行为未定义。您还可以添加一些逻辑以在最后一个元素上返回false
,以允许用户再次离开QGraphicsView
。
另请参阅QWidget::focusNextPrevChild()的文档。