QGraphicsItem和Tab顺序

时间:2011-05-06 11:46:33

标签: c++ qt qt4

对于某些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);
}

1 个答案:

答案 0 :(得分:1)

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

相关问题