Qt学习笔记-----Graphics_View_Framework
Graphics View框架中三個重要的類:QGraphicsScene, QGraphicsView, ?QGraphicsItem。
Scene提供了圖形視圖場景,它是整個框架的基礎,負責以下四個事情:
1.為了管理大量元素item,它提供了一個快速的接口
2.傳播事件給每一個元素item
3.管理元素item狀態,例如選擇和焦點處理
4.提供原生的渲染功能,主要用于繪圖。
Scene場景充當一個QGraphicsItem對象,可以使用addItem()函數將元素item添加到場景中,場景負責管理添加到自身的元素,比如傳播事件等。可以把Scene想象成一個管理器,統一管理它旗下的元素item。
View視圖主要作為場景中的視圖組件,它將場景中的內容展現在我們的眼前。同時它還負責接收來自鍵盤和鼠標的輸入事件,然后將事件轉換成場景事件然后傳播給Scene。
Item元素是場景中基礎組件,它被添加到場景中,然后被View視圖顯示出來。描述元素主要利用一些屬性,
shape()函數返回元素的輪廓圖,如果我們定義了一個類繼承QGraphicsItem,那么我們就需要實現shape()函數返回這個類表示的元素的輪廓圖(為了畫出一個東西,首先當然要知道它的輪廓圖,或者說形狀是什么樣子嘛,不然誰知道怎么畫。。。)。shape()函數返回的是QPainterPath類型,用于表示外圍輪廓。
boundingRect()函數則返回包圍元素的最小矩形,用于Scene判斷哪個區域發生了改變。
此外,QGraphicsItem類自帶碰撞檢測,這就為元素之間的相互作用提供了很大的方便。因為我們每創建一個元素,就需要使用addItem函數將其添加到Scene中,所以就可以使用QGraphicsItem::collidesWith()函數來返回所有在Scene中與該元素發生碰撞的元素。
除此之外,就是三者的坐標系統,一旦決定使用Graphics View框架,就注定要與三者的坐標變換奮斗。
首先考慮元素的坐標系統,Item Coordinates:
元素的坐標系統(坐標系)是以元素為原點繪制的,也就是說通常元素的位置都是坐標原點(0, 0),前面說的bounding rect 和shape都是在元素坐標系統中確定的。而我們通常說的元素位置坐標,是在場景Scene坐標系中定義的。
打個比方,元素坐標為(10, 0),那么它在Scene中的坐標就是(10, 0)。然后又給出在元素中的坐標(0, 10),那么在Scene中,這個坐標就是(10, 10)。
場景的坐標系統,Scene Coordinates:
場景坐標系主要用于描述元素的位置。正如前面說的元素坐標其實是在場景坐標系中確定的。
視圖的坐標系統,View Cooridinates:
視圖的坐標系總是以視圖的左上角為原點,右下角的坐標總是(width, height)。所有的鼠標事件和拖放事件的坐標都是在視圖坐標系中給定的。所以需要我們將這個坐標轉換成場景坐標來響應元素。
接下來是坐標變換,Coordinate Mapping:
通常在處理場景中的元素時,我們需要將坐標或者將幾何圖形從場景坐標轉換到元素坐標系下,或者從一個元素坐標系轉換到另一個元素坐標系,再或者是從視圖坐標系轉換到場景坐標系中。
比如說,我們想知道鼠標點擊的這個位置是場景中的哪個元素。就需要先將視圖坐標系下的坐標轉換成場景坐標系下的坐標,在通過QGraphicsScene::itemAt()函數來找到這個位置的元素。
再比如說,我們想知道一個元素在視圖中什么地方。就需要先將元素坐標系下的坐標轉換成場景坐標系下的坐標,然后再從場景坐標系下的坐標轉換成視圖坐標系下的坐標。
Qt提供了mapToScene函數用于將元素坐標系下的坐標或者視圖坐標系下的坐標轉換成場景坐標,QGraphicsItem和QGraphicsView中都有這個函數。
mapFromScene()函數用于將場景坐標系下的坐標轉換成元素坐標系下的坐標或者視圖坐標系下的坐標,Item和View也都有這個函數。
總結
以上是生活随笔為你收集整理的Qt学习笔记-----Graphics_View_Framework的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt学习笔记-----信号槽
- 下一篇: Qt学习笔记-----Model/Vie