2015-08-14 280 views
4

我的LineItem繼承自QGraphicsLineItem可以更改其筆寬。QGraphicsItem在更改boundingRect時留下僞像

我已經創建了一個boundingRect,它使用QGraphicsLineItem::boundingRect調整墊,根據筆的寬度和箭頭計算得出。有用。

void LineItem::calculateStuff() // called on any change including pen width 
{ 
    qreal padLeft, padRight, padT; 
    padLeft = 0.5 * m_pen.width(); // if no arrows 
    padT = padLeft; 
    padRight = padLeft; 
    m_boundingRect = QGraphicsLineItem::boundingRect().adjusted(-padLeft, -padT, padRight, padT); 
    update(); 
} 
QRectF LineItem::boundingRect() const 
{ 
    return m_boundingRect; 
} 
QPainterPath LineItem::shape() const 
{ 
    QPainterPath p; 
    p.addRect(m_boundingRect); 
    return p; 
} 

只有一個神器,我得到:

  • 如果我鋼筆寬度增加,然後減少它,我得到的痕跡:

enter image description hereenter image description here

  • 當我移動鼠標或任何動作時,這些當然會消失(我有一個困難的時間é獲得屏幕截圖)

儘管他們是(認真的,我認爲他們是一個「功能:-)) - 我試圖消除它們。我試圖記住以前的邊界矩形,並用上一個邊界矩形更新該項目 - 我認爲這是該選項的用處 - 但它不起作用。

QRectF oldRect = selectedItem->boundingRect(); 
item->setItemPenWidth(p); 
selectedItem->update(oldRect); 
selectedItem->update(); 

我視有

setViewportUpdateMode(BoundingRectViewportUpdate); 

如果我改變

setViewportUpdateMode(FullViewportUpdate); 

我沒有得到神器 - 但我認爲這會影響性能,這是一個主要的制約因素。

我該如何解決這些工件 - 只發生在特定情況下,減少筆寬/減少線的邊界矩,而不影響性能?

回答

2

簡單的解決方法......我不得不添加

prepareGeometryChange(); 

calculateStuff()功能。

我還沒有看到從此之前的任何變化,這是我第一次改變我的boundingRect,它不會無縫地更新。

+1

在調用'prepareGeometryChange'之前更改邊界矩形是未定義的行爲。當然,你以前可能沒有看到過不良效果:這就是未定義的行爲。要感謝它沒有格式化你的硬盤驅動器(未定義的行爲可能導致它,就其性質而言)。 –

+0

@KubaOber我認爲它確實......有一次...: - )...所以我必須在每次更改'boundingRect'之前調用它,對於每個屬性......當我說我沒有看到的變化,我包括這樣的事實,即使沒有這個調用,調整行大小或添加箭頭實際上不留下任何文物,這是令人費解的。 – Thalia

相關問題