在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 繪圖設備
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學習之路(18): Qt 標準對話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學習之路(tip): parent 參數(shù)
Qt 標準對話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標準對話框之 QFileDialog
自定義 model 之二
深入了解信號槽
坐標變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個對話框(下)
Qt 學習之路(32): 一個簡易畫板的實現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺的程序
MainWindow
初探信號槽
Qt 學習之路(17): Qt 標準對話框之 QMessageBox
繪圖設備
菜單和工具條(續(xù))
二進制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲容器
進程間交互
API 文檔的使用
創(chuàng)建一個對話框(上)
一個簡易畫板的實現(xiàn)(QWidget)

繪圖設備

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

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

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

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

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

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

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); 
}

先來看一下運行結(jié)果:

http://wiki.jikexueyuan.com/project/learn-road-qt/images/50.png" alt="" />

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

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

http://wiki.jikexueyuan.com/project/learn-road-qt/images/51.png" alt="" />

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

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

QPicture 是平臺無關(guān)的,因此它可以使用在多種設備之上,比如 svg、pdf、ps、打印機或者屏幕?;貞浵挛覀冞@里所說的 QPaintDevice,實際上是說可以有 QPainter 繪制的對象。QPicture 使用系統(tǒng)的分辨率,并且可以調(diào)整 QPainter 來消除不同設備之間的顯示差異。

如果我們要記錄下 QPainter 的命令,首先要使用 QPainter::begin()函數(shù),將 QPicture 實例作為參數(shù)傳遞進去,以便告訴系統(tǒng)開始記錄,記錄完畢后使用 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

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

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/194031