2011-05-06 5 views
1

일부 GUI 응용 프로그램에서는 QMainWindow를 다른 컨트롤 (QGraphicsScene + QGraphicsView, QPushButtons, QWidget)과 함께 사용합니다. 내부 QGraphicsScene이 다른 항목의 많은 입력 위치 : 다각형 항목이 항목은 그 플래그가,QGraphicsItem 및 탭 순서

QGraphicsPolygonItem 
QGraphicsTextItem 
QGraphicsRectItem 

하지만 나를 위해 가장 중요하다 : 나는 마우스로 모든 항목을 선택할 수 있습니다

setFlag(QGraphicsItem::ItemIsFocusable, true); 
setFlag(QGraphicsItem::ItemIsMovable, true); 
setFlag(QGraphicsItem::ItemIsSelectable, true); 

을하지만, Tab로 해당 항목의 포커스를 변경해야합니다. 어떻게 가능합니까?

SetTabOrder는 QGraphicsObjects에서만 작동합니다. 나는 ::를 QGraphicsView와 함께이 문제를 해결하기 위해 노력

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; 
      } 
     } 

    } 
} 

하지만 탭 다시를 QGraphicsView 제어 외부의 다른는 QWidget로 이동 한 포커스 버튼을 누르면에만 첫 번째 탭, 일을 재정의 focusNextPrevChild. QGraphicsItem의 탭 순서 포커스로 저를 도울 수 있습니까? 최종 버전, 스테 펜 덕분에 :

당신에게

EDIT 감사드립니다.

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

실제로 위젯을 발견했음을 나타내려면 true을 반환해야합니다. 현재 return 문이 전혀 없으므로 동작은 정의되지 않습니다. 마지막 요소에 false을 반환하는 논리를 추가하여 사용자가 QGraphicsView을 다시 벗어날 수 있도록 할 수 있습니다. QWidget::focusNextPrevChild()에 대한 설명서도 참조하십시오.

+0

감사합니다.이 작은 실수 (true 또는 false 반환)는 큰 발자국입니다. – Dmitry