QGraphicsScene
을 mouseClickEvent
으로 만들어 사용자가 그 안에 파란색 사각형을 만들도록했습니다. 하지만 사용자가 그래픽 장면의 공간을 다 떨어지지 않도록 항목이 테두리에 배치되면 장면이 커지도록하고 싶습니다.그래픽 항목이 경계에 놓일 때 QGraphicsScene을 더 크게 만듭니다.
이 경우 그래픽 장면을 더 크게 만드는 가장 좋은 방법은 무엇입니까?
QGraphicsScene
을 mouseClickEvent
으로 만들어 사용자가 그 안에 파란색 사각형을 만들도록했습니다. 하지만 사용자가 그래픽 장면의 공간을 다 떨어지지 않도록 항목이 테두리에 배치되면 장면이 커지도록하고 싶습니다.그래픽 항목이 경계에 놓일 때 QGraphicsScene을 더 크게 만듭니다.
이 경우 그래픽 장면을 더 크게 만드는 가장 좋은 방법은 무엇입니까?
나는 다음과 같이 뭔가를하고 제안 :
QGraphicsScene::itemsBoundingRect()
를 사용하여 장면에있는 모든 항목의 경계 RECT를 가져옵니다.myRect.adjust(-20, -20, 20, 20)
과 같은 것이 좋습니다.QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio)
을 사용하십시오.그렇게해야합니다. 이 코드는 장면에서 무언가가 변경 될 때마다 호출되어야합니다. QRectF :: intersects() 함수를 사용하여 새 rect가 뷰 가장자리에 있는지 여부를 확인할 수 있습니다.
이 경우 그래픽 장면을 더 크게 만드는 가장 좋은 방법은 무엇입니까?
GraphicsScene은 무한 좌표계입니다. 대부분의 고객은 itemsBoundingRect()
을 사용하여 장면의 항목에 실제로 사용 된 공간이 얼마나되는지 파악합니다. 장면을 지운 경우 QGraphicsScene::setSceneRect(QRectF())
에 "작게 만들기"를 다시 호출 할 수 있습니다.
희망이 있습니다.
죄송합니다. 조금 늦었을 경우 (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);
+1 명확한 답변입니다. 하지만 콘텐츠를 화면에 맞게 크기를 조정하고 대신 스크롤 막대 솔루션으로 이동하지 않으려면 어떻게해야합니까? – Pieter
잠깐, 찾았습니다 ... 그래픽 뷰에서'setSceneRect'를 사용해야합니다. – Pieter