Qt 2D繪圖 七 Qt座標系統深入

2022-12-09 05:45:02 字數 2694 閱讀 3098

十七、qt 2d繪圖(七)qt座標系統深入

接著上面一節,前面只是很簡單的講解了一下qt座標系統的概念,通過對幾個函式的應用,我們應該已經對qt的座標系統有了乙個模糊的認識。那麼現在就來讓我們更深入地研究一下qt視窗的座標。希望大家把這一節的例子親手做一下,不要被我所說的東西搞暈了!

我們還是在以前的工程中進行操作。

獲得座標資訊:

為了更清楚地獲得座標資訊,我們這裡利用滑鼠事件,讓滑鼠點選左鍵時輸出該點的座標資訊。

1.在工程中的檔案中新增**。

新增標頭檔案: #include

在public中新增函式宣告:void mousepressevent(qmouseevent *);

然後到檔案中:

新增標頭檔案: #include

定義函式:

void dialog::mousepressevent(qmouseevent *event)

這裡應用了qdebug()函式,利用該函式可以在程式執行時將程式中的一些資訊輸出,在qt creator中會將資訊輸出到其下面的application output視窗。這個函式很有用,在進行簡單的程式除錯時,都是利用該函式進行的。我們這裡利用它將滑鼠指標的座標值輸出出來。

2.然後更改重繪事件函式。

void dialog::paintevent(qpaintevent *)

我們繪製了乙個左上頂點為(0,0),寬和高都是50的矩形。

3.這時執行程式。並在繪製的矩形左上頂點點選一下滑鼠左鍵。效果如下。(點選可看大圖)

因為滑鼠點的不夠準確,所以輸出的是(1,0),我們可以認為左上角就是原點(0,0)點。你可以再點選一下矩形的右下角,它的座標應該是(50,50)。這個方法掌握了以後,我們就開始研究這些座標了。

研究放大後的座標

1.我們現在進行放大操作,然後檢視其座標的變化。

void dialog::paintevent(qpaintevent *)

我們將橫縱座標都擴大2倍,然後執行程式,檢視效果:

我們點選矩形右下頂點,是(100,100),比以前的(50,50)擴大了2倍。

研究qpixmap或qimage的座標

對於qwidget,qpixmap或qimage等都是繪圖裝置,我們都可以在其上利用qpainter進行繪圖。現在我們研究一下qpixmap的座標(qimage與其效果相同)。

1.我們更改重繪事件函式如下。

void dialog::paintevent(qpaintevent *)

這裡新建了乙個寬、高都是200畫素的qpixmap類物件,並將其背景顏色設定為紅色,然後從視窗的原點(0,0)點新增該qpixmap類物件。為了表述方便,在下面我們將這個qpixmap類物件pix稱為畫布。

我們執行程式,並在畫布的左上角和右下角分別點選一下,效果如下:

可以看到其左上角為(0,0)點,右下角為(200,200)點,是沒有問題的。

2.我們再將函式更改如下。

void dialog::paintevent(qpaintevent *)

這時我們從視窗的(100,100)點新增該畫布,那麼此時我們再點選畫布的右上角,其座標會是多少呢?

可以看到,它是(100,100),沒錯,這是視窗上的座標,那麼這是不是畫布上的座標呢?

3.我們接著更改函式。

void dialog::paintevent(qpaintevent *)

這裡我們又新建了乙個qpainter類物件pp,其中pp(&pix)表明,pp所進行的繪圖都是在畫布pix上進行的。

現在先說明一下:

qpainter painter(this) ,this就表明了是在視窗上進行繪圖,所以利用painter進行的繪圖都是在視窗上的,painter進行的座標變化,是變化的視窗的座標系;而利用pp進行的繪圖都是在畫布上進行的,如果它進行座標變化,就是變化的畫布的座標系。

我們在畫布上的(0,0)點和(50,50)點之間繪製了一條直線。這時執行程式,點選這條直線的兩端,看看其座標值。

結果是直線的兩端的座標分別是(100,100),(150,150)。我們從中可以得出這樣的結論:

第一,qwidget和qpixmap各有一套座標系統,它們互不影響。可以看到,無論畫布在視窗的什麼位置,它的座標原點依然在左上角,為(0,0)點,沒有變。

第二,我們所得到的滑鼠指標的座標值是視窗提供的,不是畫布的座標。

下面我們繼續研究:

4.比較下面兩個例子。

例子一:

void dialog::paintevent(qpaintevent *)

例子二:

void dialog::paintevent(qpaintevent *)

兩個例子中都使直線的長度擴大了兩倍,但是第乙個例子是擴大的畫布的座標系,第二個例子是擴大的視窗的座標系,你可以看一下它們的效果。

你仔細看一下輸出,兩個例子中畫布的大小都沒有變。

如果你看過了我寫的那個繪圖軟體的教程(鏈結過去),現在你就能明白我在其中講「問題一」時說的意思了:雖然畫布看起來是大了,但是其大小並沒有變,其中座標也沒有變。變的是畫素的大小或者說畫素間的距離。

但是,有一點你一定要搞明白,這只是在qpixmap與qwidget結合時才出現的,是相對的說法。其實利用scale()函式是會讓座標變化的,我們在開始的例子已經證明了。

結論:現在是不是已經很亂了,一會兒是視窗,一會兒是畫布,一會兒座標變化,一會兒又不變了,到底是怎麼樣呢?

其實只需記住一句話:

所有的繪圖裝置都有自己的座標系統,它們互不影響。

QT00D262H05消音板變形分析報告

一 背景 11年7月13日,我司接到三菱客戶反饋我司生產的qt00d262h05產品消音板變形,我司迅速組織人員進行調查確認。二 現狀調查 1 現場實物確認 接收客戶反饋後,我司立即組織相關人員對內部庫存品,現場生產品進行解剖分析,確認最終結果如下 小結 經我司品質 技術人員對現場在製品,庫存品進行...

讀書心得2d

對於成功我有了全新的認識,我不能確定自己將來能否獲得許多人所推崇的名和利。但我認為,成功就是要不斷超越自我 讓自己不虛度此生 讓自己的人生活得更快樂 健康 充實 有意義。事業上取得進步是成功,給家人帶來幸福快樂是成功,廣交朋友是成功,自己所做的事情能對他人有所幫助也是成功。成功的道路很遙遠,只要不虛...

deform2D實驗報告

學生實驗報告書 實驗教學管理基本規範 實驗是培養學生動手能力 分析解決問題能力的重要環節 實驗報告是反映實驗教學水平與質量的重要依據。為加強實驗過程管理,改革實驗成績考核方法,改善實驗教學效果,提高學生質量,特制定實驗教學管理基本規範。1 本規範適用於理工科類專業實驗課程,文 經 管 計算機類實驗課...