QT学习之图形视图框架
文章目錄
- 坐標系統
- 圖形項坐標
- 場景坐標
- 視圖坐標
- 坐標映射
- 事件處理與傳播
- QGraphicsScene 管理 QGraphicsItem(單擊/選擇/移動/縮放/刪除)
- 參考
坐標系統
圖形項坐標
圖元生活在自己的局部坐標系。它們的坐標通常圍繞它們的中心點(0, 0),并且這也是所有轉換的中心。圖元坐標系下的幾何元素通常指點、線或矩形。
創建自定義圖元時,只需考慮圖元坐標即可。QGraphicsScene和QGraphicsView會為你實現所有相關的轉換,這樣一來,實現自定義圖元就容易多了。例如:當你接收到鼠標按下或拖拽事件時,事件位置將由圖元坐標給出。如果某一點(傳遞一個圖元坐標作為參數)在圖元中,那么GraphicsItem::contains()虛函數將會返回true;否則,返回false。同樣的,項綁定的矩形或形狀區域也是項坐標系統的。同樣的,圖元的矩形邊界和形狀都是基于圖元坐標的。
圖元的位置是圖元的中心點在其父坐標系下的坐標,有時也被稱為父坐標。場景從這個意義上說是所有無父圖元的“parent”,頂層圖元的位置在場景坐標中。
子坐標是相對于父坐標而言的。如果子坐標沒有轉換,那么子坐標和父坐標的差異就和圖元在父坐標中的距離一樣。例如:一個未經轉換的子圖元正好位于父圖元的中心點,那么,這兩個圖元的坐標系是完全一樣的。如果子圖元的位置是(10, 0),那么子圖元的(0, 10)點就對應父圖元的(10, 10)點位置。
由于圖元的位置和轉換是相對于父圖元來說的,因此,雖然父圖元的轉換隱式地轉換了子圖元,但是子圖元的坐標不會因父圖元的轉換而受到影響。在上述示例中,即使父圖元經過了旋轉和縮放,子圖元的(0, 10)點始終對應父圖元的(10, 10)點。不過相對于場景來說,子圖元將隨著父圖元進行轉換和偏移 。如果父圖元縮放了(2x, 2x),那么子圖元在場景中的坐標是(20, 0),并且其(10, 0)點將會對應于場景中的(40, 0)點。
不管圖元或父圖元進行了怎樣的轉換,QGraphicsItem的函數操作都在圖元坐標內。例如:一個圖元的矩形邊界(QGraphicsItem::boundingRect())總是在圖元坐標下給出。但是QGraphicsItem::pos()是例外之一,該函數表示其在父圖元中的位置 。
場景坐標
場景為所有的圖元提供了基礎的坐標系。場景坐標系描述了每一個頂層圖元的位置,同時構成了從視圖傳遞到場景的所有場景事件的基礎。場景中的每個圖元都有一個場景位置和矩形邊界(QGraphicsItem::scenePos()、QGraphicsItem::sceneBoundingRect());另外,也有其自身的位置和矩形邊界。場景位置描述了圖元在場景坐標下內的位置,場景矩形邊界則提供給QGraphicsScene來決定場景中的哪塊區域已經被改變了。場景中的變化通過QGraphicsScene::changed()信號發出,參數是場景矩形列表。
視圖坐標
視圖坐標是部件的坐標,視圖坐標中的每個單位對應一個像素。對于該坐標系來說比較特殊的一點是:它相對于部件或視口,不會受被觀察的場景所影響。QGraphicsView的視口左上角總是(0, 0),右下角總是(viewport width, viewport height)。所有的鼠標事件和拖拽事件都以視圖坐標接收到的,你需要將這些坐標映射到場景,以便于和圖元進行交互。
坐標映射
事件處理與傳播
QGraphicsScene 管理 QGraphicsItem(單擊/選擇/移動/縮放/刪除)
學習見鏈接
如果想讓場景使用橡皮筋進行框選,則可以使用:
setDragMode(QGraphicsView::RubberBandDrag);
但是圖形項不能設置成:
setFlag(QGraphicsItem::ItemIsFocusable);
而是應該設置成:
setFlag(QGraphicsItem::ItemIsSelectable);
這里提供一份代碼:可以使用
使用shift+鼠標左鍵單選
使用ctrl+鼠標左鍵多選
使用鼠標的橡皮筋進行多選
參考
https://blog.csdn.net/liang19890820/article/details/51966791
總結
以上是生活随笔為你收集整理的QT学习之图形视图框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT学习之图形视图
- 下一篇: QT中使用rubberband橡皮筋等方