QPainter的setViewport()視區與setWindow()窗口理解

先看助手說明:

1.QPainter的viewport()與window()分別代表着物理座標與邏輯座標區域,默認兩個區域是重合的,也就是用戶指定的rect區域在兩者上是同樣的大小、位置。

2.setWindow()可以設置你想指定的rect區域,比如rect=(-50,-50,100,100),此時你定義的邏輯區域左上座標(-50,-50),右下座標(50,50),大小(100X100),最重要的是QPainter的drawLine、drawRect或者其它draw操作都是以這個邏輯座標區域爲準來繪製圖像的,也就是此時的座標系原點(0,0)就是(-50,-50)了。

 

3.SetViewport()設置的是物理座標區域,它代表着實際顯示的區域,切記這只是用戶規定的畫圖區域而不是畫圖的座標直接以它爲準,你畫的圖像還是以window()區域的座標系爲準,最終是要將winodw()邏輯區域映射到viewport()物理區域的,這樣以後在使用QPainter進行繪製圖形時就可以通過設置這兩個方法去放大、平移圖像了,比如保持window()邏輯座標不變,將viewport()物理座標區域大小變爲之前的2倍,那麼實際顯示的圖像也會自動放大2倍了,至於平移也差不多,我懶得算了。

 

4.先拿物理座標viewport()來說,它既然是實際的繪製顯示區域,那麼就先單獨把它拿出來瞅瞅。我先將界面大小resize(300, 100);然後去定義一塊viewport(),看我的樣子viewport()的rt是定義成(100,0,100,100)了,具體的自己去算。接下來我填充了viewport()的矩形區域(紅色),繪製了一個矩形框(藍色),但是這樣看起來紅色和藍色顯示的位置和大小都不太對啊,紅色rt(100,0,100,100)大小是個100X100的正方形,而藍色rect()則是整個widget的QRect(0,0 300x100),怎麼想都不太對啊。此時就要講講window()了,雖然我沒有setWindow(),但是看輸出的window()默認值可是QRect(0,0 300x100),將window邏輯區域大小與viewport()物理座標區域大小進行比較,很明顯兩者高度相等,但是寬度前者是後者的三倍,也就是說繪製到邏輯座標區域內的圖像映射到實際物理座標區域後,高度一樣,寬度變爲原來的三分之一了,這也就解釋了爲什麼紅色與藍色看起來不對的問題。

 

rect()  : QRect(0,0 300x100)
viewport: QRect(100,0 100x100)
window  : QRect(0,0 300x100)

從這個例子中,可以很直觀的看到window()與viewport()的映射寬度比例爲3:1(高度相同),我們繪製的圖像都是先繪製到window()的邏輯區域內,然後才映射到viewport()的物理區域內顯示出來的,假如我們想繪製一個300X100大小的矩形框,經過映射後實際顯示的也只有100X100大小了。


5.再拿邏輯座標區域window()來說,理解了上邊的例子後這個就更簡單了。我們知道繪製的圖形是要先放到window()區域內,最後映射到實際的物理座標系中的,這裏resize(200, 200),然後直接setWindow(QRect(0, 0, 50, 50)),邏輯座標區域的大小就變成了50X50了,接下來繪製了兩條對角線以及一個矩形框,顯示效果如圖所示。雖然當前widget的size爲200X200,但是繪製的線及矩形框的連接點都是在window()的上下左右四個頂點上(大小都是50X50),而默認的viewport()爲this->rect(),即實際物理座標區域爲整個widget的區域,因此不需要管映射的比例是多少,物理座標區域內實際顯示的一定是個對角線以及矩形框。

 

rect()  : QRect(0,0 200x200)
viewport: QRect(200,0 200x200)
window  : QRect(0,0 50x50)

小結:viewport()控制圖形實際顯示的區域在哪,而window()是承載圖形繪製的區域,一般視圖和窗口的寬高比最好保持一致,否則顯示的圖形可能會變形的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章