2011-04-12 6 views
2

누군가 QGraphicsView의 크기에 맞게 현재 QGraphicsItem 크기를 조정할 수있는 QGraphicsView을 만들려고합니다.확대 QGraphicsView에 맞게 QGraphicsItem

나는 사용자 정의 버전을 만들기 위해 QGraphicsItem을 오버라이드했으며 몇 가지 방법을 구현 했으므로 크기가 조정 된 정도를 알 수 있습니다 (원본에 항상 비례하므로 하나의 축척 비율 - 너비와 높이에 동일 함). 신장).

void ImagePixmapItem::setScaleFactor(float sf){ 
    scaleFactor = sf; 
    this->boundingRect().setWidth(this->boundingRect().width()*scaleFactor); 
    this->boundingRect().setHeight(this->boundingRect().height()*scaleFactor); 

} 

그리고 내 주요 형태, 나는 버튼에 다음과 같습니다 :

QRect portRect = ui->graphicsView->viewport()->rect(); 
    double scaleFactorX; 
    if(portRect.width() <= (item->boundingRect().size().width())) 
     scaleFactorX =portRect.width() /(item->boundingRect().size().width()); 
    else 
     scaleFactorX = (item->boundingRect().size().width())/portRect.width(); 

    qDebug("Scalefactor: %4.3f \n", scaleFactorX); 
    qDebug("item width: %4.3f \n", item->boundingRect().size().width()); 
    qDebug("item height: %4.3f \n", item->boundingRect().size().height()); 
    item->setScaleFactor(scaleFactorX); 
    item->scale(scaleFactorX,scaleFactorX); 

ImagePixmapItem 중 1 곳 item입니다

는 그래서 scaleFactor 세터에서 나는 다음이 .

처음 이미지가 뷰포트보다 크고 창의 크기에 맞게 잘 조정됩니다 (최소 너비 이상). 그러나 버튼을 다시 누르면 scaleFactorXitem 너비와 높이의 동일한 값이 다시 나타납니다.

변형 된 이미지의 boundingRect을 변경할 수 있습니까? 그렇지 않다면 어떻게해야합니까?

답변

2

우선 QGraphicsItem::boundingRect()은 rect 사본을 반환합니다. 그것을 변경해도 실제 항목에는 아무런 영향을 미치지 않습니다. 항목의 지오메트리를 변경하려면 해당 함수를 재정의하고 다른 rect를 반환해야합니다. 실제로 변경하면 prepareGeometryChange()으로 전화하십시오.

이제 QGraphicsView의 뷰포트에 항목을 맞추려면 QGraphicsView::fitInView()을 사용하십시오.

항목의 변환을 변경하면 장면에서보기로 변환을 변경하는 것과 매우 다릅니다. 전자는 다른 항목과 관련하여 항목이 장면에 배치되는 방법을 변경합니다. 나중에는 관계를 유지하고 장면이 장면에 "반영"되는 방식에만 영향을 미칩니다.

장면에 하나의 항목이 있으면 큰 차이는 없습니다. 아이템 변환이 월드의 수학적 모델을 다루는 방법이지, 그것을 보는 방법이 아닌 복잡한 장면을 다룰 때 명심하십시오.

편집 :

확인을 클릭합니다. 이제 코드를 다시 읽고 읽습니다. 스케일 팩터를 잘못 계산하는 것으로 나타났습니다. 다음은 기본, 비 - 테스트 코드는 다음과 같습니다

QRect itemSize = graphicsView->mapFromScene(item->sceneBoundingRect()).boundingRect().size(); 
QRect scaledSize =itemSize.scale(rgaphicsView->viewpoer().size(), Qt::KeepAspectRatio); 
double ratio = qMin((double)scaledSize.width()/itemSize().width(), (double)scaledSize.height()/itemSize().height()); 
item->setTransform(QTransform::fromScale(ratio,ratio), true); 

점은 boundingRect 이후 sceneBoundingRect 대신 boundingRect을 사용하는 것입니다 관계없이 항상 항목의 변환 동일 항목 지역의 경계는. 그리고 sceneBoundingRect는 모두 transformations이 적용된 이후의 경계입니다.

+0

fitInView를 사용하는 경우 실제로 항목 자체의 크기가 조정됩니까? 염두에 두십시오, 장면에 여러 항목이있는 경우 실제로 뷰에 맞게 포커스가있는 단일 항목을 조작하려고합니다. 뷰 자체가 뷰의 항목에 맞도록 크기가 조정됩니다. – Derek

+0

I 개별 항목 크기를 조작하고 싶지는 않습니다. 그렇다면'fitToView'는 답이 아닙니다. 죄송합니다.그러나,'setScaleFactor()'는 단지 임시 변수를 설정하기 때문에 아무런 효과가 없습니다. 개별 항목 크기 조정에 대한 내 편집을 참조하십시오. –

관련 문제