首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGraphicsItem和Tab键顺序

QGraphicsItem和Tab键顺序
EN

Stack Overflow用户
提问于 2011-05-06 19:46:33
回答 1查看 1.2K关注 0票数 1

对于一些图形用户界面应用程序,我使用带有不同控件的QMainWindow : QGraphicsScene + QGraphicsView、QPushButtons、QWidget。在QGraphicsScene内部,有很多不同的项目类型:

代码语言:javascript
复制
QGraphicsPolygonItem
QGraphicsTextItem
QGraphicsRectItem

但对我来说最重要的是多边形项目,这个项目有这些标志:

代码语言:javascript
复制
setFlag(QGraphicsItem::ItemIsFocusable, true);
setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true);

我可以通过鼠标选择每个项目,但我需要通过Tab来更改这些项目的焦点。这怎么可能呢?

SetTabOrder只适用于QGraphicsObjects。我试图用QGraphicsView::focusNextPrevChild重新定义来解决这个问题

代码语言:javascript
复制
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。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-06 23:38:21

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5910947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档