天天看點

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

<a target="_blank" href="http://bbs.qter.org/forum.php?mod=viewthread&amp;tid=115">樓主</a>

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

 發表于 2013-5-2 17:59:00 | 檢視:

886| 回複: 3

繪制圖檔

版權聲明

導語

qt提供了四個類來處理圖像資料:qimage、qpixmap、qbitmap和qpicture,它們也都是常用的繪圖裝置。其中qimage主要用來進行i/o處理,它對i/o處理操作進行了優化,而且也可以用來直接通路和操作像素;qpixmap主要用來在螢幕上顯示圖像,它對在螢幕上顯示圖像進行了優化;qbitmap是qpixmap的子類,它是一個便捷類,用來處理顔色深度為1的圖像,即隻能顯示黑白兩種顔色;qpicture用來記錄并重演qpainter指令。這一節我們隻講解qpixmap。

環境:windows xp + qt 4.8.4+qtcreator 2.6.2

目錄

一、簡單繪制圖檔

二、平移圖檔

三、縮放圖檔

四、旋轉圖檔

五、扭曲圖檔

正文

1.這次我們重新建立一個qt gui應用,項目名稱為painter_2,在類資訊頁面,将基類更改為qdialog,類名使用預設的dialog即可。

2.然後在源碼目錄中複制一張圖檔,比如這裡是一張背景透明的logo.png圖檔,如下圖所示。

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

3.在dialog.h檔案中添加重繪事件處理函數的聲明:

protected:

    void paintevent(qpaintevent *);

4.到dialog.cpp檔案中先添加頭檔案包含#include &lt;qpainter&gt;,然後添加函數的定義:

void dialog::paintevent(qpaintevent *)

{

    qpainter painter(this);

    qpixmap pix;

    pix.load("../painter_2/logo.png");

    painter.drawpixmap(0, 0, 129, 66, pix);

}

    這裡使用了相對路徑,因為qt

creator預設是使用影子建構,即編譯生成的檔案在painter_2-build-desktop-debug這樣的目錄裡面,而這個目錄就是目前目錄,是以源碼目錄就是其上級目錄了。大家可以根據自己的實際情況來更改路徑,也可以使用絕對路徑,不過最好使用資源檔案來存放圖檔。drawpixmap()函數在給定的矩形中來繪制圖檔,這裡矩形的左上角頂點為(0, 0)點,寬129,高66,如果這個跟圖檔的大小不相同,預設會拉伸圖檔。運作效果如下圖所示。

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

(注意:下面的操作涉及到了坐标系統,這裡不再詳細講解,大家先進行操作檢視效果,具體的坐标内容将在下一節講解。)

qpainter類中的translate()函數實作坐标原點的改變,改變原點後,此點将會成為新的原點(0,0)。下面來看一個例子。

在paintevent()函數裡面繼續添加如下代碼:

painter.translate(100, 100); //将(100,100)設為坐标原點

painter.drawpixmap(0, 0, 129, 66, pix);

運作程式,效果如下圖所示。

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

這裡将(100,100)設定為了新的坐标原點,是以下面在(0,0)點貼圖,就相當于在以前的(100,100)點貼圖。

我們可以使用qpixmap類中的scaled()函數來實作圖檔的放大和縮小。

在paintevent()函數中繼續添加代碼:

qreal width

= pix.width(); //獲得以前圖檔的寬和高

qreal height

= pix.height();

//将圖檔的寬和高都擴大兩倍,并且在給定的矩形内保持寬高的比值不變

pix = pix.scaled(width*2, height*2, qt::keepaspectratio);

painter.drawpixmap(70, 70,pix);

其中參數qt::keepaspectratio,是圖檔縮放的方式。我們可以檢視其幫助。将滑鼠指針放到該代碼上,當出現f1提示時,按下f1鍵,這時就可以檢視其幫助了。當然我們也可以直接在幫助裡查找該關鍵字。如下圖所示。

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

這裡有三個值,隻看其圖檔就可大緻明白,qt::ignoreaspectratio是不保持圖檔的寬高比,qt::keepaspectratio是在給定的矩形中保持寬高比,最後一個也是保持寬高比,但可能超出給定的矩形。這裡給定的矩形是由我們顯示圖檔時給定的參數決定的,例如painter.drawpixmap(0,0,100,100,pix);就是在以(0,0)點為起始點的寬和高都是100的矩形中。

運作程式效果如下圖所示。

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

旋轉使用的是qpainter類的rotate()函數,它預設是以原點為中心進行旋轉的。我們要改變旋轉的中心,可以使用前面講到的translate()函數完成。

在paintevent()函數中繼續添加如下代碼:

painter.translate(64, 33); //讓圖檔的中心作為旋轉的中心painter.rotate(90); //順時針旋轉90度painter.translate(-64,-33); //使原點複原painter.drawpixmap(100,

100, 129, 66, pix);

這裡必須先改變旋轉中心,然後再旋轉,然後再将原點複原,才能達到想要的效果。

運作程式,效果如圖所示。

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

實作圖檔的扭曲,是使用的qpainter類的shear(qreal sh,qreal sv)函數完成的。它有兩個參數,前面的參數實作橫行變形,後面的參數實作縱向變形。當它們的值為0時,表示不扭曲。

在paintevent()中繼續添加如下代碼:

painter.shear(0.5, 0); //橫向扭曲

painter.drawpixmap(100, 0, 129, 66, pix);

運作效果如下圖所示。

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

結語

       這一節中隻講解了qpixmap類的簡單應用。對于後面講到的圖檔變形的應用,細心的讀者可能已經發現了,旋轉了坐标系統以後再繪制圖檔都是縱向的,這就是因為旋轉了坐标系統而沒有進行恢複造成的。具體的坐标操作我們會在下一節講解。

涉及到的源碼: 

[Qt教程] 第15篇 2D繪圖(五)繪制圖檔 [Qt教程] 第15篇 2D繪圖(五)繪制圖檔

kb, 下載下傳次數: 20)