自定义QGraphicsItem
前言
QGraphicsItem 是場(chǎng)景中 item 的基類。圖形視圖提供了一些典型形狀的標(biāo)準(zhǔn) item,例如:矩形 ( QGraphicsRectItem )、橢圓 ( QGraphicsEllipseItem ) 、文本項(xiàng) ( QGraphicsTextItem )。當(dāng)這些不滿足需求時(shí)(例如:需要一些特定形狀時(shí)),往往需要自定義,通常的做法就是繼承 QGraphicsItem(QGraphicsObject)。
自定義Item
必須要實(shí)現(xiàn)兩個(gè)虛函數(shù),否則會(huì)報(bào)allocating an object of abstract class type “xxxx”。
void paint() : 以本地坐標(biāo)繪制 item 的內(nèi)容
QRectF boundingRect() : 將 item 的外邊界作為矩形返回由 QGraphicsView 調(diào)用以確定什么區(qū)域需要重繪
除此之外,可能還需要附加其他需求,
例如:QPainterPath shape() - item 的形狀 由contains() 和 collidesWithPath() 用于碰撞檢測(cè)。如果未實(shí)現(xiàn),則默認(rèn)為 boundingRect()。
使用信號(hào)/槽、屬性機(jī)制:繼承 QObject 和 QGraphicsItem(或直接繼承 QGraphicsObject)
處理鼠標(biāo)事件:重新實(shí)現(xiàn) mouse***Event()
處理鍵盤事件:重新實(shí)現(xiàn) key***Event()
處理拖放事件:重新實(shí)現(xiàn) drag***Event()、dropEvent()
Bounding Rect
將 item 的外邊界定義為矩形,所有繪制必須限制在此區(qū)域內(nèi),QGraphicsView 使用它來確定 item 是否需要重繪。
雖然 item 的形狀可以是任意的(例如:直線、橢圓、矩形 ),但是 bounding rect 總是矩形,并且不受 item 變換的影響。
Shape
它是一個(gè)虛函數(shù),具體需求依靠自己去實(shí)現(xiàn)。
以本地坐標(biāo)中的 QPainterPath 形式返回 item 的形狀。形狀可用于許多事情,包括:碰撞檢測(cè),命中測(cè)試以及 QGraphicsScene::items() 函數(shù)。
shape() 默認(rèn)實(shí)現(xiàn)調(diào)用 boundingRect() 返回一個(gè)簡(jiǎn)單的矩形形狀,但子類可以重新實(shí)現(xiàn)該函數(shù),以返回非矩形 item 更準(zhǔn)確的形狀。例如,一個(gè)圓形 item 可以選擇返回橢圓形狀,以便更好地進(jìn)行碰撞檢測(cè)。
shape() 由 contains() 和 collidesWithPath() 的默認(rèn)實(shí)現(xiàn)調(diào)用。
collidesWithItem
它用來判斷item與其他item是否有碰撞。
參考這篇博客:https://blog.csdn.net/chen_yi_long/article/details/8273644
多多少少 會(huì)有些 靈感
對(duì)于一些要生成特定item,依據(jù)實(shí)際需要添加,然后實(shí)現(xiàn)特定函數(shù)功能。可能 會(huì)結(jié)合 QPropertyAnimation QGraphicsItemAnimation QTime 實(shí)現(xiàn)一些特定效果
參考博客:https://www.cnblogs.com/klcf0220/p/10316510.html
總結(jié)
以上是生活随笔為你收集整理的自定义QGraphicsItem的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GOOGLE 火星
- 下一篇: Untiy 接入 移动MM 详解 转