程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Qt學習之路(29):繪圖設備

Qt學習之路(29):繪圖設備

編輯:關於C++

繪圖設備是指繼承QPainterDevice的子類。Qt一共提供了四個這樣的類,分別是QPixmap、QBitmap、QImage和 QPicture。其中,QPixmap專門為圖像在屏幕上的顯示做了優化,而QBitmap是QPixmap的一個子類,它的色深限定為1,你可以使用 QPixmap的isQBitmap()函數來確定這個QPixmap是不是一個QBitmap。QImage專門為圖像的像素級訪問做了優化。 QPicture則可以記錄和重現QPainter的各條命令。下面我們將分兩部分介紹這四種繪圖設備。

QPixmap繼承了QPaintDevice,因此,你可以使用QPainter直接在上面繪制圖形。QPixmap也可以接受一個字符串作為一個文件的路徑來顯示這個文件,比如你想在程序之中打開png、jpeg之類的文件,就可以使用 QPixmap。使用QPainter的drawPixmap()函數可以把這個文件繪制到一個QLabel、QPushButton或者其他的設備上面。QPixmap是針對屏幕進行特殊優化的,因此,它與實際的底層顯示設備息息相關。注意,這裡說的顯示設備並不是硬件,而是操作系統提供的原生的繪圖引擎。所以,在不同的操作系統平台下,QPixmap的顯示可能會有所差別。

QPixmap提供了靜態的grabWidget()和grabWindow()函數,用於將自身圖像繪制到目標上。同時,在使用QPixmap時,你可以直接使用傳值也不需要傳指針,因為QPixmap提供了“隱式數據共享”。關於這一點,我們會在以後的章節中詳細描述,這裡只要知道傳遞QPixmap不必須使用指針就好了。

QBitmap繼承自QPixmap,因此具有QPixmap的所有特性。QBitmap的色深始終為1. 色深這個概念來自計算機圖形學,是指用於表現顏色的二進制的位數。我們知道,計算機裡面的數據都是使用二進制表示的。為了表示一種顏色,我們也會使用二進制。比如我們要表示8種顏色,需要用3個二進制位,這時我們就說色深是3. 因此,所謂色深為1,也就是使用1個二進制位表示顏色。1個位只有兩種狀態:0和1,因此它所表示的顏色就有兩種,黑和白。所以說,QBitmap實際上是只有黑白兩色的圖像數據。

由於QBitmap色深小,因此只占用很少的存儲空間,所以適合做光標文件和筆刷。

下面我們來看同一個圖像文件在QPixmap和QBitmap下的不同表現:

void PaintedWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPixmap pixmap("Cat.png");
QBitmap bitmap("Cat.png");
painter.drawPixmap(10, 10, 128, 128, pixmap);
painter.drawPixmap(140, 10, 128, 128, bitmap);
QPixmap pixmap2("Cat2.png");
QBitmap bitmap2("Cat2.png");
painter.drawPixmap(10, 140, 128, 128, pixmap2);
painter.drawPixmap(140, 140, 128, 128, bitmap2);
}

先來看一下運行結果:

這裡我們給出了兩張png圖片。Cat.png是沒有透明色的純白背景,而Cat2.png是具有透明色的背景。我們分別使用QPixmap和QBitmap來加載它們。注意看它們的區別:白色的背景在Qbitmap中消失了,而透明色在QBitmap中轉換成了黑色;其他顏色則是使用點的疏密程度來體現的。

QPixmap使用底層平台的繪制系統進行繪制,無法提供像素級別的操作,而QImage則是使用獨立於硬件的繪制系統,實際上是自己繪制自己,因此提供了像素級別的操作,並且能夠在不同系統之上提供一個一致的顯示形式。

如上圖所示(出自Qt API文檔),我們聲明了一個QImage對象,大小是3 x 3,顏色模式是RGB32,即使用32位數值表示一個顏色的RGB值,也就是說每種顏色使用8位。然後我們對每個像素進行顏色賦值,從而構成了這個圖像。你可以把QImage想象成一個RGB顏色的二維數組,記錄了每一像素的顏色。

最後一個需要說明的是QPicture。這是一個可以記錄和重現QPainter命令的繪圖設備。 QPicture將QPainter的命令序列化到一個IO設備,保存為一個平台獨立的文件格式。這種格式有時候會是“元文件(meta- files)”。Qt的這種格式是二進制的,不同於某些本地的元文件,Qt的pictures文件沒有內容上的限制,只要是能夠被QPainter繪制的元素,不論是字體還是pixmap,或者是變換,都可以保存進一個picture中。

QPicture是平台無關的,因此它可以使用在多種設備之上,比如svg、pdf、ps、打印機或者屏幕。回憶下我們這裡所說的QPaintDevice,實際上是說可以有QPainter繪制的對象。QPicture使用系統的分辨率,並且可以調整 QPainter來消除不同設備之間的顯示差異。

如果我們要記錄下QPainter的命令,首先要使用QPainter::begin()函數,將QPicture實例作為參數傳遞進去,以便告訴系統開始記錄,記錄完畢後使用QPainter::end()命令終止。代碼示例如下:

QPicture picture;
QPainter painter;
painter.begin(&picture);  // paint in picture
painter.drawEllipse(10,20, 80,70); // draw an ellipse
painter.end(); // painting done
picture.save("drawing.pic");  // save picture

如果我們要重現命令,首先要使用QPicture::load()函數進行裝載:

QPicture picture;
picture.load("drawing.pic"); // load picture
QPainter painter;
painter.begin(&myImage); // paint in myImage
painter.drawPicture(0, 0, picture); // draw the picture at (0,0)
painter.end();

出處:http://devbean.blog.51cto.com/448512/239845

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved