2010-11-21 1 views
1

QGraphicsScenemouseClickEvent으로 만들어 사용자가 그 안에 파란색 사각형을 만들도록했습니다. 하지만 사용자가 그래픽 장면의 공간을 다 떨어지지 않도록 항목이 테두리에 배치되면 장면이 커지도록하고 싶습니다.그래픽 항목이 경계에 놓일 때 QGraphicsScene을 더 크게 만듭니다.

이 경우 그래픽 장면을 더 크게 만드는 가장 좋은 방법은 무엇입니까?

답변

3

나는 다음과 같이 뭔가를하고 제안 :

  1. QGraphicsScene::itemsBoundingRect()를 사용하여 장면에있는 모든 항목의 경계 RECT를 가져옵니다.
  2. 해당 경계선 주위에 패딩을 추가하여 항목의 경계가 뷰 가장자리에 부딪 치지 않도록하십시오. myRect.adjust(-20, -20, 20, 20)과 같은 것이 좋습니다.
  3. 촬영 영역이보기의 가시 범위 내에 있는지 확인하려면 QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio)을 사용하십시오.

그렇게해야합니다. 이 코드는 장면에서 무언가가 변경 될 때마다 호출되어야합니다. QRectF :: intersects() 함수를 사용하여 새 rect가 뷰 가장자리에 있는지 여부를 확인할 수 있습니다.

이 경우 그래픽 장면을 더 크게 만드는 가장 좋은 방법은 무엇입니까?

GraphicsScene은 무한 좌표계입니다. 대부분의 고객은 itemsBoundingRect()을 사용하여 장면의 항목에 실제로 사용 된 공간이 얼마나되는지 파악합니다. 장면을 지운 경우 QGraphicsScene::setSceneRect(QRectF())에 "작게 만들기"를 다시 호출 할 수 있습니다.

희망이 있습니다.

+0

+1 명확한 답변입니다. 하지만 콘텐츠를 화면에 맞게 크기를 조정하고 대신 스크롤 막대 솔루션으로 이동하지 않으려면 어떻게해야합니까? – Pieter

+0

잠깐, 찾았습니다 ... 그래픽 뷰에서'setSceneRect'를 사용해야합니다. – Pieter

0

죄송합니다. 조금 늦었을 경우 (6 년), 누군가가 여전히 고민 중이거나 다른 접근 방식을 원한다면 대답을 제공 할 것입니다. QgraphicsObject에서 파생 된 맞춤 클래스의 mouseReleaseEvent에서 구현합니다. QgraphicsScene (1000,1000)의 크기를 다음 코드로 초기화합니다. scene->setSceneRect(0,0,1000,1000). 그래서 여기 내 코드가 할 것입니다. 항목 (항목이 드래그 가능)이 경계선에 배치되면 해당 경계선이 증가합니다. 여기 내 코드가 있습니다 :

void MyItem::mouseReleaseEvent(QgraphicsceneMouseEvent* event){ 
    QRectF tempRect = this->scene()->sceneRect(); 
    if(this->scenePos().y() < this->scene()->sceneRect().top()){ 
     tempRect.adjust(0,-200,0,0); 
     if(this->scenePos().x() < this->scene()->sceneRect().left()){ 
      tempRect.adjust(-200,0,0,0); 
     } 
     else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){ 
     tempRect.adjust(0,0,200,0); 
     } 
    } 
    else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){ 
     tempRect.adjust(0,0,0,200); 
     if(this->scenePos().x() < this->scene()->sceneRect().left()){ 
      tempRect.adjust(-200,0,0,0); 
    } 
    else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){ 
     tempRect.adjust(0,0,200,0); 
    } 
} 
else if(this->scenePos().x() < this->scene()->sceneRect().left()){ 
     tempRect.adjust(-200,0,0,0); 
     if(this->scenePos().y() < this->scene()->sceneRect().top()){ 
      tempRect.adjust(0,-200,0,0); 
     } 
     else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){ 
      tempRect.adjust(0,0,0,200); 
     } 
    } 
    else if(this->scenePos().x() + 200> this->scene()->sceneRect().right()){ 
     tempRect.adjust(0,0,200,0); 
     if(this->scenePos().y() < this->scene()->sceneRect().top()){ 
      tempRect.adjust(0,-200,0,0); 
     } 
     else if(this->scenePos().y() + 200 > this->scene()->sceneRect().bottom()){ 
      tempRect.adjust(0,0,0,200); 
     } 
    } 

    this->scene()->setSceneRect(tempRect);