我製作了一個QGraphicsScene
,其中mouseClickEvent
允許用戶在其內部創建藍色方塊。但是當物品放置在邊界上時,我想讓場景變大,以便用戶永遠不會在圖形場景中耗盡空間。當圖形項目被放置在邊界上時,使QGraphicsScene變大
在這種情況下製作圖形場景的最佳方式是什麼?
我製作了一個QGraphicsScene
,其中mouseClickEvent
允許用戶在其內部創建藍色方塊。但是當物品放置在邊界上時,我想讓場景變大,以便用戶永遠不會在圖形場景中耗盡空間。當圖形項目被放置在邊界上時,使QGraphicsScene變大
在這種情況下製作圖形場景的最佳方式是什麼?
我建議做類似如下:
QGraphicsScene::itemsBoundingRect()
場景中的所有項目的邊界矩形。myRect.adjust(-20, -20, 20, 20)
應該就足夠了。QGraphicsView::fitInView(myRect, Qt::KeepAspectRatio)
確保拍攝區域位於視圖的可見邊界內。應該這樣做。只要場景中的某些內容發生更改,就應該調用此代碼。您可以使用QRectF :: intersects()函數來確定新的矩形是否已放置在視圖的邊緣。
在這種情況下製作圖形場景的最佳方法是什麼?
GraphicsScene是一個無限的座標系統。大多數客戶將使用itemsBoundingRect()
來了解場景中的物品實際使用了多少空間。如果您已清除場景,則可能需要撥打QGraphicsScene::setSceneRect(QRectF())
再次將其「變小」。
希望有所幫助。
對不起,如果這有點晚(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);
+1得到一個明確的答案。但是如果我不希望內容的大小適合屏幕並使用滾動條解決方案呢? – Pieter 2010-11-22 12:40:49
等待,發現它......我必須在圖形視圖上使用'setSceneRect'。 – Pieter 2010-11-22 12:45:44