Q项和 Tab 键顺序

QGraphicsItem and tab order

本文关键字:顺序 Tab 项和      更新时间:2023-10-16

对于某些GUI应用程序,我使用带有不同控件的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 工作,当我再次按下 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);
}

您应该返回true以指示您确实找到了一个小部件。由于您目前根本没有返回语句,因此行为是未定义的。您还可以添加一些逻辑来返回最后一个元素的false,以允许用户再次离开您的QGraphicsView。另请参阅 QWidget::focusNextPrevChild() 的文档。