对于一些图形用户界面应用程序,我使用带有不同控件的QMainWindow : QGraphicsScene + QGraphicsView、QPushButtons、QWidget。在QGraphicsScene内部,有很多不同的项目类型:
QGraphicsPolygonItem
QGraphicsTextItem
QGraphicsRectItem但对我来说最重要的是多边形项目,这个项目有这些标志:
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键时,焦点已经移动到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);
}发布于 2011-05-06 23:38:21
您应该返回true,以指示您实际上找到了一个小部件。因为您目前根本没有return语句,所以行为是未定义的。您还可以添加一些逻辑,以便在最后一个元素上返回false,以允许用户再次离开您的QGraphicsView。另请参阅QWidget::focusNextPrevChild()的文档。
https://stackoverflow.com/questions/5910947
复制相似问题