2013-11-21 39 views
4

我正在使用Qt的圖形視圖框架可視化圖形。它看起來是這樣的:在多個視圖中固定大小的QGraphicsItems?

Example view from the program

現在,我想的頂點,這我畫的小實心圓形,大小保持相對於視圖的縮放不變。目前,我被沒有我的頂點在場景中的項目,而是把他們拉在視圖的drawForeground(...)功能,這樣完成的:

void View::drawForeground(QPainter *painter, const QRectF& rect) { 
    painter->setMatrixEnabled(false); 
    painter->setPen(Qt::NoPen); 
    painter->setBrush(Qt::black); 
    painter->setRenderHint(QPainter::Antialiasing); 

    // Draw points. 
    const QRectF biggerRect = rect.adjusted(-100, -100, 100, 100); 
    const float radius = 2.0; 
    foreach (const QPointF& point, m_points) { 
     if (biggerRect.contains(point)) { 
      painter->drawEllipse(QPointF(mapFromScene(point)), radius, radius); 
     } 
    } 

    // ... 
} 

但是,這是缺憾和錯誤的,因爲頂點是概念我的場景的一部分,應該是我的QGraphicsScene中的項目。另外,作爲一個例子,我可能想要暫時隱藏一組頂點,或者將它們轉換,如果它們是場景中的適當項目,這將更容易做到。最後但並非最不重要的是,讓視圖繪製點將打破模型/視圖分離並強制視圖瞭解它們正在顯示的點(可能有多個視圖)。

使用這種方法時,我也遇到了頂點(非項目)和邊緣(項目)的相對位置結束錯誤的問題,當視圖QSvgGenerator時,可能是由於我禁止轉換畫家。

所以,我的問題是:在每個顯示場景的視圖中,我怎樣才能將我的頂點作爲QGraphicsItem添加到我的場景中,同時仍然保持其相對於視圖的大小不變?

我已經嘗試設置項目上的QGraphicsItem::ItemIgnoresTransformations標誌。該文檔有這個關於國旗的說法:

該項忽略繼承的轉換(即其位置仍然錨定到其父,但父視圖或視圖旋轉,縮放或剪切轉換被忽略)。此標誌對於保持文本標籤項目水平和未縮放非常有用,因此如果視圖已轉換,它們仍然可讀。設置後,項目的視圖幾何和場景幾何將分開維護。您必須調用deviceTransform()來映射座標並檢測視圖中的碰撞。默認情況下,該標誌被禁用。這個標誌是在Qt 4.3中引入的。

但是設置這個標誌會導致所有的視圖變換被忽略,這樣當我放大時點不會再變得更遠,這不是我想要的。我只想要項目大小(在屏幕上的像素)保持不變。

由於Merlin069問這樣的:

QGraphicsEllipseItem *item = scene->addEllipse(x - 2.0, y - 2.0, 4.0, 4.0); 
item->setPen(Qt::NoPen); 
item->setBrush(Qt::black); 
item->setFlag(QGraphicsItem::ItemIgnoresTransformations); 

下面是我得到了什麼,然後截圖:當我試圖此標誌出來是簡單地增加每個頂點到我的場景是這樣我使用的代碼。在2X,4X縮放,8x上的項目的大小保持恆定(耶),但這樣做的點之間的畫面上的距離:(

Another screenshot

任何提示/上解決這一指針讚賞!

+0

你能用QGraphicsItem :: ItemIgnoresTransformations顯示你使用的代碼嗎?我期望如果視圖縮小,點應保持在場景中的大小和位置,所以它們應該顯得分散。 – TheDarkKnight

+0

啊,好點。將我用於此的代碼添加到了我的問題中。 – estan

+1

你在哪裏設置橢圓的位置?只需添加它們將它們設置在場景中的(0,0)處。 – TheDarkKnight

回答

2

如果你看一下文檔的addEllipse它規定: -

創建並增加了一個橢圓項目現場,並返回項指針。橢圓的幾何形狀由rect定義,其筆和筆刷初​​始化爲筆和筆刷。

請注意,該項目的幾何圖形以項目座標提供,並且其位置初始化爲(0,0)。

所以你在這裏做的是把所有的項目放在(0,0),但是項目的rects正在改變。你需要做的是創建項目,然後設置他們的位置。

+1

Spot on。再次感謝。 – estan

+0

不客氣; O) – TheDarkKnight

0
QGraphicsItem::setFlag(QGraphicsItem::ItemIgnoresTransformations,true); 

這應該可以做到。