自定義QGraphicsItem

簡述:
QGraphicsItem 是場景中 item 的基類。圖形視圖提供了一些典型形狀的標準 item,例如:矩形 ( QGraphicsRectItem )、橢圓 ( QGraphicsEllipseItem ) 、文本項 ( QGraphicsTextItem )。當這些不知足需求時(例如:在一些複雜的工做流場景中),每每須要自定義,一般的作法就是繼承 QGraphicsItem。
ide

自定義 QGraphicsItem
要實現自定義 item,須要覆蓋 QGraphicsItem 的兩個純虛函數:函數

void paint() : 以本地座標繪製 item 的內容測試

QRectF boundingRect()  : 將 item 的外邊界做爲矩形返回由 QGraphicsView 調用以肯定什麼區域須要重繪。
除此以外,可能還須要附加其餘需求,例如:QPainterPath shape() - item 的形狀 由 contains() 和 collidesWithPath() 用於碰撞檢測。若是未實現,則默認爲 boundingRect()。
使用信號/槽、屬性機制:繼承 QObject 和 QGraphicsItem(或直接繼承 QGraphicsObject)
處理鼠標事件:從新實現 mouse***Event()
處理鍵盤事件:從新實現 key***Event()
處理拖放事件:從新實現 drag***Event()、dropEvent()
……blog

Bounding Rect 和 Shape
先來一張效果圖,解釋 Bounding Rect 和 Shape 的聯繫與區別:繼承

20161215123125054

Bounding Rect事件

將 item 的外邊界定義爲矩形,全部繪製必須限制在此區域內,QGraphicsView 使用它來肯定 item 是否須要重繪。ip

雖然 item 的形狀能夠是任意的(例如:直線、橢圓、矩形 ),可是 bounding rect 老是矩形,而且不受 item 變換的影響。get

Shape工作流

以本地座標中的 QPainterPath 形式返回 item 的形狀。形狀可用於許多事情,包括:碰撞檢測,命中測試以及 QGraphicsScene::items() 函數。it

shape() 默認實現調用 boundingRect() 返回一個簡單的矩形形狀,但子類能夠從新實現該函數,以返回非矩形 item 更準確的形狀。例如,一個圓形 item 能夠選擇返回橢圓形狀,以便更好地進行碰撞檢測。

shape() 由 contains() 和 collidesWithPath() 的默認實現調用。

相關文章
相關標籤/搜索