<a target="_blank" href="http://bbs.qter.org/forum.php?mod=viewthread&tid=115">樓主</a>
發表于 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圖檔,如下圖所示。
3.在dialog.h檔案中添加重繪事件處理函數的聲明:
protected:
void paintevent(qpaintevent *);
4.到dialog.cpp檔案中先添加頭檔案包含#include <qpainter>,然後添加函數的定義:
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,如果這個跟圖檔的大小不相同,預設會拉伸圖檔。運作效果如下圖所示。
(注意:下面的操作涉及到了坐标系統,這裡不再詳細講解,大家先進行操作檢視效果,具體的坐标内容将在下一節講解。)
qpainter類中的translate()函數實作坐标原點的改變,改變原點後,此點将會成為新的原點(0,0)。下面來看一個例子。
在paintevent()函數裡面繼續添加如下代碼:
painter.translate(100, 100); //将(100,100)設為坐标原點
painter.drawpixmap(0, 0, 129, 66, pix);
運作程式,效果如下圖所示。
這裡将(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::ignoreaspectratio是不保持圖檔的寬高比,qt::keepaspectratio是在給定的矩形中保持寬高比,最後一個也是保持寬高比,但可能超出給定的矩形。這裡給定的矩形是由我們顯示圖檔時給定的參數決定的,例如painter.drawpixmap(0,0,100,100,pix);就是在以(0,0)點為起始點的寬和高都是100的矩形中。
運作程式效果如下圖所示。
旋轉使用的是qpainter類的rotate()函數,它預設是以原點為中心進行旋轉的。我們要改變旋轉的中心,可以使用前面講到的translate()函數完成。
在paintevent()函數中繼續添加如下代碼:
painter.translate(64, 33); //讓圖檔的中心作為旋轉的中心painter.rotate(90); //順時針旋轉90度painter.translate(-64,-33); //使原點複原painter.drawpixmap(100,
100, 129, 66, pix);
這裡必須先改變旋轉中心,然後再旋轉,然後再将原點複原,才能達到想要的效果。
運作程式,效果如圖所示。
實作圖檔的扭曲,是使用的qpainter類的shear(qreal sh,qreal sv)函數完成的。它有兩個參數,前面的參數實作橫行變形,後面的參數實作縱向變形。當它們的值為0時,表示不扭曲。
在paintevent()中繼續添加如下代碼:
painter.shear(0.5, 0); //橫向扭曲
painter.drawpixmap(100, 0, 129, 66, pix);
運作效果如下圖所示。
結語
這一節中隻講解了qpixmap類的簡單應用。對于後面講到的圖檔變形的應用,細心的讀者可能已經發現了,旋轉了坐标系統以後再繪制圖檔都是縱向的,這就是因為旋轉了坐标系統而沒有進行恢複造成的。具體的坐标操作我們會在下一節講解。
涉及到的源碼:
kb, 下載下傳次數: 20)