2010-11-21 22 views

回答

3

我建議做類似如下:

  1. 獲取使用QGraphicsScene::itemsBoundingRect()場景中的所有項目的邊界矩形。
  2. 在該矩形周圍添加一些填充以確保項目的邊界不會碰到視圖的邊緣。像myRect.adjust(-20, -20, 20, 20)應該就足夠了。
  3. 使用QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio)確保拍攝區域位於視圖的可見邊界內。

應該這樣做。只要場景中的某些內容發生更改,就應該調用此代碼。您可以使用QRectF :: intersects()函數來確定新的矩形是否已放置在視圖的邊緣。

在這種情況下製作圖形場景的最佳方法是什麼?

GraphicsScene是一個無限的座標系統。大多數客戶將使用itemsBoundingRect()來了解場景中的物品實際使用了多少空間。如果您已清除場景,則可能需要撥打QGraphicsScene::setSceneRect(QRectF())再次將其「變小」。

希望有所幫助。

+0

+1得到一個明確的答案。但是如果我不希望內容的大小適合屏幕並使用滾動條解決方案呢? – Pieter 2010-11-22 12:40:49

+0

等待,發現它......我必須在圖形視圖上使用'setSceneRect'。 – Pieter 2010-11-22 12:45:44

0

對不起,如果這有點晚(6年),但我會提供一個答案,如果有人仍然掙扎着這個或想要另一種方法。我實現這個在mouseReleaseEvent自定義類派生從QgraphicsObject。請注意,我用下面的代碼初始化我的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); 
相關問題