Qt中QGraphics類坐標映射關系詳解


1、Item(圖元)坐標:屬於局部坐標,通常以圖元中心為原點(中心對稱)非中心對稱類,比如dialog類,一般以左上角為原點正方向x朝右,y朝下

2、setPos的坐標是父類坐標系的坐標,一般對於item位於scene中的應用場景

3、scene(場景)坐標屬於邏輯坐標 logical coordinates(與QPainter相同)以場景中心為原點,正方向x朝右,y朝下。

4、圖元原點(左上角dialog的原點)與場景原點對齊,導致圖元外邊框的左上角頂點在場景中的坐標位置為(負數,負數)。

5、View(視圖)坐標屬於設備坐標device coordinates(與窗口相同),默認以左上點為原點 正方向x朝右,y朝下

6、默認場景scene的左上角頂點與視圖坐標原點對齊。顯示時默認中心對齊,當場景大小小於視圖大小的時候,將中心對齊,此中指的仍然是整個圖元的中心,同時,圖元原點與場景原點對齊,場景左上角頂點與視圖原點對齊,視圖左上角頂點不一定是原點???,此時也將出現視圖坐標有正值有負值。

 

1)translate()將當前視圖坐標原點平移,從而實現顯示圖像的平移變換。由於默認場景的左上角頂點與視圖坐標原點對齊,translate()將坐標原點平移,也就實現了將場景的平移。

2)rotate()將當前視圖圍繞視圖坐標原點旋轉,從而實現顯示圖像的旋轉變換。

3)size()返回視圖大小,默認大小100*30,由於視圖可以是無限大小而且只有在顯示后才創建出實際尺寸,因此只有在showEvent中調用 size 函數才能正確顯示視圖大小,否則都是返回默認的100*30,因為此時視圖尚未顯示,即尚未形成。

 

--------------------------------------------------------------------------------------------------------------------------------------------------

 

首先,先上顯示界面圖(Embeded dialog),下面就是以該實例講解:

6597897698914052525

1。QGraphicsItem及其衍生類以及其他可作為圖元的類,總稱Item(圖元)類

      Item坐標,屬於局部坐標,通常以圖元中心為原點(中心對稱)非中心對稱類,比如dialog類,一般以左上角為原點。故Item坐標的原點,需要具體問題具體分析。正方向x朝右,y朝下。除setPos函數外,所有Item類使用或得到的坐標都是該Item坐標。

1)boundingRect()返回外邊框的左上頂點在item中的坐標(區別於原點,原點是(0,0)點,但是外邊框由於具有寬度,所以肯定在原點的左上角,因此得到的坐標肯定是(負數,負數)的),比如下圖:

2047730455670258985

輸出:        

3014597000671340646

對應到顯示的點位如下:

6598130795379038381

2)  setPos的坐標是父類坐標系的坐標,一般對於item位於scene中的應用場景,setPos對應的坐標就是scene(場景)坐標,輸入的位置pos意思是該圖元的原點在所在的場景坐標中的坐標,即該圖元在場景中放置的位置。可以通過調用pos或scenePos查看。比如下圖:

2065744854179602931

輸入(紅色框出部分):

899594025667791548

對應到顯示的點位如下:

3122401916751435520

注:個人認為應該是坐標原點,也就是默認的scene與整個item的原點(即左上角dialog的原點)對齊。此時dialog外邊框頂點在場景中的位置將為(負數,負數),而非(0,0)。

2。QGraphicsScene類,即scene(場景)類

        scene(場景)坐標,屬於邏輯坐標 logical coordinates(與QPainter相同),以場景中心為原點,正方向x朝右,y朝下。圖元嵌入場景中,默認場景原點與圖元原點對齊。場景默認的對其方式為居中對其,這個中指的不是原點,而是所有item的Rect的中心點,是計算出來的。如果scene的大小超過view的可顯示最大值,此時將改成左上角對齊顯示,左上角點也不一定是場景坐標原點。如下面兩圖對比:

1679561186132690974

2019020008045634644

注:從上圖(左上角對齊圖)可以看出,場景中心不是顯示的中心,顯示中心是計算出來的,場景坐標就是虛擬的一個坐標中心,目的是方便計算。場景與圖元整體默認原點對其,從而在上圖(左上角對齊圖)中,圖元原點(左上角dialog的原點)與場景原點對齊,導致圖元外邊框的左上角頂點在場景中的坐標位置為(負數,負數),此時場景左上角點不是(0,0)而是(負數,負數)。如下圖:

6597550253239675268

  1)itemsBoundingRect()返回場景中所有item的外框頂點坐標和所有item整體的長寬。由於采用動態遍歷所有圖元的方法,所以當圖元較多時,這個計算比較耗時。如圖如下:

1440025980951859438

輸出如下:

6597320455309080892

界面計算如下:

3143794014981561128

2)sceneRect()返回場景中可以看到的區域的頂點和長寬,可以看到的區域區別於所有圖元的外邊框itemsBoundingRect的頂點和長寬,一般二者是相同的,當出現圖元移除時,二者才不同。因為sceneRect不能減少只能增加,故移除圖元不能使可見的區域縮小,從而sceneRect不變,但是itemsBoundingRect()將減小。可以通過setSceneRect來重新設定區域的頂點和長寬。如圖所示:

1921629666103818167

輸出如圖: 

6597732772169884109

3。QGraphicsView類,即View(視圖)類

        視圖坐標,屬於設備坐標device coordinates(與窗口相同),默認以左上點為原點, 正方向x朝右,y朝下,此時坐標總是正值。當然,也可以通過調用函數translate更改視圖坐標的原點位置,從而使視圖坐標既有正值又有副值。顯示時,默認場景scene的左上角頂點與視圖坐標原點對齊。又由於顯示時默認中心對齊,當場景大小小於視圖大小的時候,將中心對齊,此中指的仍然是整個圖元的中心,同時,圖元原點與場景原點對齊,場景左上角頂點與視圖原點對齊,視圖左上角頂點不一定是原點,此時也將出現視圖坐標有正值有負值。

1)translate()將當前視圖坐標原點平移,從而實現顯示圖像的平移變換。由於默認場景的左上角頂點與視圖坐標原點對齊,translate()將坐標原點平移,也就實現了將場景的平移。

2)rotate()將當前視圖圍繞視圖坐標原點旋轉,從而實現顯示圖像的旋轉變換。

3)size()返回視圖大小,默認大小100*30,由於視圖可以是無限大小而且只有在顯示后才創建出實際尺寸,因此只有在showEvent中調用 size 函數才能正確顯示視圖大小,否則都是返回默認的100*30,因為此時視圖尚未顯示,即尚未形成。

 

轉載地址:http://klqulei23.blog.163.com/blog/static/132315337201392524857204/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM