QPixmap顯示圖片
現在我們來實現在窗口上顯示圖片,並學習怎樣將圖片進行平移,縮放,旋轉和扭曲。這里我們是利用QPixmap類來實現圖片顯示的。
一、利用QPixmap顯示圖片。
1.將以前的工程文件夾進行復制備份,我們這里將工程文件夾改名為painter05。(以前已經說過,經常備份工程目錄,是個很好的習慣)
2.在工程文件夾的debug文件夾中新建文件夾,我這里命名為images,用來存放要用的圖片。我這里放了一張linux.jpg的圖片。如下圖所示。
3.在Qt Creator中打開工程。(即打開工程文件夾中的.pro文件),如圖。
4.將dialog.cpp文件中的paintEvent()函數更改如下。
void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(“images/linux.jpg”);
painter.drawPixmap(0,0,100,100,pix);
}
這里新建QPixmap類對象,並為其添加圖片,然后在以(0,0)點開始的寬和高都為100的矩形中顯示該圖片。你可以改變矩形的大小,看一下效果啊。最終程序運行效果如下。
(說明:下面的操作都會和坐標有關,這里請先進行操作,我們在下一節將會講解坐標系統。)
二、利用更改坐標原點實現平移。
Qpainter類中的translate()函數實現坐標原點的改變,改變原點后,此點將會成為新的原點(0,0);
例如:
void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(“images/linux.jpg”);
painter.drawPixmap(0,0,100,100,pix);
painter.translate(100,100); //將(100,100)設為坐標原點
painter.drawPixmap(0,0,100,100,pix);
}
這里將(100,100)設置為了新的坐標原點,所以下面在(0,0)點貼圖,就相當於在以前的(100,100)點貼圖。效果如下。
三、實現圖片的縮放。
我們可以使用QPixmap類中的scaled()函數來實現圖片的放大和縮小。
例如:
void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(“images/linux.jpg”);
painter.drawPixmap(0,0,100,100,pix);
qreal width = pix.width(); //獲得以前圖片的寬和高
qreal height = pix.height();
pix = pix.scaled(width*2,height*2,Qt::KeepAspectRatio);
//將圖片的寬和高都擴大兩倍,並且在給定的矩形內保持寬高的比值
painter.drawPixmap(100,100,pix);
}
其中參數Qt::KeepAspectRatio,是圖片縮放的方式。我們可以查看其幫助。將鼠標指針放到該代碼上,當出現F1提示時,按下F1鍵,這時就可以查看其幫助了。當然我們也可以直接在幫助里查找該代碼。
這是個枚舉變量,這里有三個值,只看其圖片就可大致明白,Qt::IgnoreAspectRatio是不保持圖片的長寬比,Qt::KeepAspectRatio是在給定的矩形中保持長寬比,最后一個也是保持長寬比,但可能超出給定的矩形。這里給定的矩形是由我們顯示圖片時給定的參數決定的,例如painter.drawPixmap(0,0,100,100,pix);就是在以(0,0)點為起始點的寬和高都是100的矩形中。
程序運行效果如下。
四、實現圖片的旋轉。
旋轉使用的是QPainter類的rotate()函數,它默認是以原點為中心進行旋轉的。我們要改變旋轉的中心,可以使用前面講到的translate()函數完成。
例如:
void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(“images/linux.jpg”);
painter.translate(50,50); //讓圖片的中心作為旋轉的中心
painter.rotate(90); //順時針旋轉90度
painter.translate(-50,-50); //使原點復原
painter.drawPixmap(0,0,100,100,pix);
}
這里必須先改變旋轉中心,然后再旋轉,然后再將原點復原,才能達到想要的效果。
運行程序,效果如下。
五、實現圖片的扭曲。
實現圖片的扭曲,是使用的QPainter類的shear(qreal sh,qreal sv)函數完成的。它有兩個參數,前面的參數實現橫行變形,后面的參數實現縱向變形。當它們的值為0時,表示不扭曲。
例如:
void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(“images/linux.jpg”);
painter.drawPixmap(0,0,100,100,pix);
painter.shear(0.5,0); //橫向扭曲
painter.drawPixmap(100,0,100,100,pix);
}
效果如下:
其他扭曲效果:
painter.shear(0,0.5); //縱向扭曲
painter.shear(0.5,0.5); //橫縱扭曲
圖片形狀的變化,其實就是利用坐標系的變化來實現的