Qt窗口-視口機制分析

       在QPainter中存在兩個函數,分別是setWindow和setViewPort,分別用來設置繪圖窗口和繪圖的視口。

       首先要說明的是,這個窗口和視口和可能和其它地方說明的窗口和視口含義不一樣;另外,在《C++ GUI Qt4編程》一書中也沒用很詳細的講解這兩個概念。所以筆者經過測試,把相關知識描述如下。
       以在QWidget中繪圖爲例,QWidget大小(600,600)。
       Qt繪圖時,如果不顯式的指定窗口和視口,默認的窗口和視口都是(0,0,widget.width(),widget.height())。那麼窗口-視口變換過程中的線性關係是X' = X;Y' = Y;其中(X,Y)是窗口中的座標,(X',Y')是視口中的座標。那麼此時繪製的圖形是以一個不變的關係繪製在QWidget上,沒有任何的平移等效果。
  
       如果使用setWindow(-300,-300,600,600)和setViewPort(-100,-100,600,600)之後呢,那麼這個窗口-視口的線性關係則需要重新計算了,怎麼計算?
       設X'=aX+b;Y'=cY+d; 那麼需要確定參數a,b,c,d。如何確定?
       使用窗口座標和視口座標進行計算,在窗口(-300,-300,600,600)中,實際上是指定了窗口的兩個座標,左上角(-300,-300),右下角(300,300);在視口(-100,-100,600,600)中,指定了視口左上角座標(-100,-100),視口右下角(500,500).根據左上角對應左上角,右下角對應右下角的關係,得到:x方向上有:-100=-300a+b,500=300a+b,解得a=1,b=200;y方向有:-100=-300c+d,500=300c+d,解得c=1,d=200。

       得到關係後再來繪圖則是經過該關係變換後的值了。
       比如painter.drawPoint(0,10),對應x=0,得到x'=0*a+b=200;對應y=10,得到y'=10*c+d=210;即實際上是在widget的(200,210)處繪製了一個點。

       以上即是QPainter窗口-視口機制的具體計算過程。

(如有錯誤請指教!)
      本文寫於2011.5.3中午——天王巨星
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章