QT技术应用_2D绘图(转)
QT技術(shù)應(yīng)用_2D繪圖(轉(zhuǎn))
分類(lèi): 與企業(yè)共成長(zhǎng) 2011-06-03 13:02 6170人閱讀 評(píng)論(0) 收藏 舉報(bào) qt圖形存儲(chǔ)postscript框架windowshttp://www.rosoo.net/a/201102/10900.html
?
?
2D繪圖?
Qt4中的2D繪圖部分稱(chēng)為Arthur繪圖系統(tǒng).它由3個(gè)類(lèi)支撐整個(gè)框架,QPainter,QPainterDevice和QPainterEngine.QPainter用來(lái)執(zhí)行具體的繪圖相關(guān)操作如畫(huà)點(diǎn),畫(huà)線,填充,變換,alpha通道等。QPainterDevice是QPainter用來(lái)繪圖的繪圖設(shè)備,Qt中有幾種預(yù)定義的繪圖設(shè)備,如QWidget,QPixamp,QPrinter等.他們都從QPaintDevice繼承。QPaintEngine類(lèi)提供了不同類(lèi)型設(shè)備的接口,QPaintEngine對(duì)程序員不透明,由QPainter,QPaintDevice類(lèi)與其進(jìn)行交互。
從Qt4.2開(kāi)始,Graphics View框架取代了QCanvas,QGraphics View框架使用了MVC模式,適合對(duì)大量2D圖元的管理,Grphics View框架中,場(chǎng)景(scene)存儲(chǔ)了圖形數(shù)據(jù),它通過(guò)視圖(view)以多種表現(xiàn)形式,每個(gè)圖元(item)可以單獨(dú)進(jìn)行控制.
Arthur繪圖基礎(chǔ)
在Arthur繪圖框架中的基本繪圖元素是畫(huà)筆,畫(huà)刷。
QPainter類(lèi)具有GUI程序需要的絕大多數(shù)函數(shù),能夠繪制基本圖形(點(diǎn),線,矩形,多邊形等)以及復(fù)雜的圖形(如繪圖路徑).使用繪圖路徑(QPaintPath)的優(yōu)點(diǎn)是復(fù)雜形狀的圖形之用生成一次,以后再使用的時(shí)候是需要調(diào)用QPainter::drawPath()就可以了。QPainterPath對(duì)象可以用來(lái)填充,繪制輪廓。
線和輪廓都可以用畫(huà)筆(QPen)進(jìn)行繪制,畫(huà)刷(QBrush)進(jìn)行填充。畫(huà)筆定義了風(fēng)格(線形),寬度,筆尖畫(huà)刷以及端點(diǎn)是如何繪制的(cap-style),端點(diǎn)的連接方式(join-style)
.畫(huà)刷用來(lái)填充畫(huà)筆繪制的圖形,可以定制不同的填充模式和顏色的畫(huà)刷。
當(dāng)繪制文字時(shí),字體使用QFont類(lèi)定義,Qt使用指定字體的屬性,如果沒(méi)有匹配的字體,Qt將使用最接近的字體。字體屬性可以通過(guò)QFontInfo來(lái)獲取。
字體的度量(measurement)
使用QFontMetrics類(lèi)來(lái)獲取。QFontDatabase類(lèi)可以獲得底層窗口系統(tǒng)所有可用的字體.
通常情況下QPainter以默認(rèn)的坐標(biāo)系統(tǒng)進(jìn)行繪制,也可以用QMatrix類(lèi)對(duì)坐標(biāo)進(jìn)行變換。
當(dāng)繪制時(shí),可以使用QPainter::RenderHint來(lái)告訴繪圖引擎是否啟用飯鋸齒功能使圖變得平滑。
QPainter::RenderHint的可取如表6-1中的值
------------------------------------
QPainter::Antialiasing?????????? 告訴繪圖引擎應(yīng)該在可能的情況下進(jìn)行邊的反鋸齒繪制
QPainter::TextAntialiasing?????? 盡可能的情況下文字的反鋸齒繪制
QPainter::SmoothPixmapTransform? 使用平滑的pixmap變換算法(雙線性插值算法),而不是近鄰插值算法
------------------------------------
QPainter的繪圖函數(shù)?
------------------------------------
drawArc()???????????????????????????????? 弧
drawChord()?????????????????????????????? 弦
drawConvexPolygon()?????????????????????? 凸多邊形
drawEllipse()???????????????????????????? 橢圓
drawImage()?????????????????????????????? QImage表示的圖像
drawLine()??????????????????????????????? 線
drawLines()?????????????????????????????? 多條線
drawPath()??????????????????????????????? 路徑
drawPicture()???????????????????????????? 按QPainter指令繪制
drawPie()???????????????????????????????? 扇形
drawPixmap()????????????????????????????? QPixmap表示的圖像
drawPoint()?????????????????????????????? 點(diǎn)
drawPoints()????????????????????????????? 多個(gè)點(diǎn)
drawPolygon()???????????????????????????? 多邊形
drawPolyline()??????????????????????????? 多折線
drawRect()??????????????????????????????? 矩形
drawRects()?????????????????????????????? 多個(gè)矩形
drawRoundRect()?????????????????????????? 圓角矩形
drawText()??????????????????????????????? 文字
drawTiledPixmap()???????????????????????? 平鋪圖像
drawLineSegments()??????????????????????? 繪制折線
------------------------------------
drawPicture()函數(shù)負(fù)責(zé)繪制QPicture中存儲(chǔ)的QPainter指令,QPicture是可以記錄QPainter繪圖指令的類(lèi).它將QPainter的繪圖指令串行化為平臺(tái)無(wú)關(guān)的存儲(chǔ)格式。
下面的代碼將記錄的繪圖指令重繪。
QPicture picture;
picture.load("mypicture.pic");
QPainter painter(this);
painter.drawPicture(0,0,picture);//在(0,0)處重放繪圖指令,也可以使用QPicture::play()完成相同的功能
=========================================
使用畫(huà)筆
畫(huà)筆的屬性包括線型,線寬,顏色等。畫(huà)筆的屬性可以在構(gòu)造函數(shù)中指定,也可以使用setStyle(),setWidth(),setBrush(),setCapStyle(),setJoinStyle()等函數(shù)逐項(xiàng)設(shè)定畫(huà)筆的各項(xiàng)屬性.Qt中使用Qt::PenStyle定義了6種畫(huà)筆風(fēng)格,分別是Qt::SolidLine,Qt::DashLine,Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,
Qt::CustomDashLine.自定義線風(fēng)格(Qt::CustomDashLine),需要使用QPen的setDashPattern()函數(shù)來(lái)設(shè)定自定義風(fēng)格.
下面代碼設(shè)置了一個(gè)自定義QPen
QPen pen;
QVector?customDashes;
qreal blank=4;
dashes<<2< pen.setDashPattern(customDashes);
端點(diǎn)風(fēng)格(cap style)
端點(diǎn)風(fēng)格決定了線的端點(diǎn)樣式,它只對(duì)線寬大于1的線有效。Qt種定義了三種端點(diǎn)風(fēng)格用枚舉類(lèi)型Qt::PenCapStyle表示,分別為Qt::SqureCap,QT::FlatCap,Qt::RoundCap,
連接風(fēng)格(Join style)
連接風(fēng)格是兩條線如何連接,連接風(fēng)格對(duì)線寬大于等于1的線有效。Qt定義了四種連接方式用枚舉類(lèi)型Qt::PenStyle表示.分別是Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin.
Qt::SvgMiterJoin.
2.畫(huà)刷
在Qt中圖形使用QBrush進(jìn)行填充,畫(huà)刷包括填充顏色和風(fēng)格(填充模式).在Qt中,顏色使用QColor類(lèi)表示,QColor支持RGB,HSV,CMYK顏色模型。QColor還支持alpha混合的輪廓和
填充。基本模式填充包括有各種點(diǎn),線組合的模式。Qt支持RGB,HSV,和CMYK顏色模型。RGB是面向硬件的模型。顏色由紅綠藍(lán)三種基色混合而成。HSV模型比較符合人對(duì)顏色的感覺(jué),由
色調(diào)(0-359),飽和度(0-255),亮度(0-255)組成.CMYK由青,洋紅,黃,黑四種基色組成。主要用于打印機(jī)等硬件拷貝設(shè)備上。每個(gè)顏色分量的取值是0-255.另外QColor還可以用
SVG1.0中定義的任何顏色名為參數(shù)初始化.
Qt4提供了漸變填充的畫(huà)刷,漸變填充包括兩個(gè)要素,顏色的變化和路徑的變化。顏色變化可以指定從一種顏色漸變到另外一種顏色。也可以在變化的路徑上指定一些點(diǎn)的顏色進(jìn)行分段漸變。
Qt4中,提供了三種漸變填充:線性(QLinearGradient),圓形(QRadialGradient)和圓錐漸變(QConicalGradient).所有的類(lèi)都從QGradient類(lèi)繼承.
------------------
線性漸變填充
線性漸變填充指定兩個(gè)控制點(diǎn),畫(huà)刷在兩個(gè)控制點(diǎn)之間進(jìn)行顏色插值。通過(guò)創(chuàng)建QLinearGradient對(duì)象來(lái)設(shè)置畫(huà)刷.
QLinearGradient linearGradient(0,0,200,100);
linearGradient.setColorAt(0,Qt::red);
linearGradient.setColorAt(0.5,Qt::green);
linearGradient.setColorAt(1,Qt::blue);
painter.setBrush(linearGradient);
painter.drawRect(0,0,200,100);
在QGradient構(gòu)造函數(shù)中指定線行填充的兩點(diǎn)分別為(0,0),(100,100).setColorAt()函數(shù)在0-1之間設(shè)置指定位置的顏
------------------
圓形漸變填充
圓形漸變填充需要指定圓心,半徑和焦點(diǎn)。畫(huà)刷在焦點(diǎn)和圓上的所有點(diǎn)之間進(jìn)行顏色插值。創(chuàng)建QRadialGradient對(duì)象設(shè)置畫(huà)刷
QRadialGradient radialGradient(50,50,50,30,30);
radialGradient.setColorAt(0.2,Qt::cyan);
radialGradient.setColorAt(0.8,Qt::yellow);
radialGradient.setColorAt(1,Qt::magenta);
painter.setBrush(radialGradient);
painter.drawEllipse(0,0,100,100);
-------------------------------
圓錐漸變填充
圓錐漸變填充指定圓心和開(kāi)始角,畫(huà)刷沿圓心逆時(shí)針對(duì)顏色進(jìn)行插值,創(chuàng)建QConicalGradient對(duì)象并設(shè)置畫(huà)刷.
QConicalGradient conicalGradient(60,40,30);
conicalGradient.setColorAt(0,Qt::gray);
conicalGradient.setColorAt(0.4,Qt::darkGreen);
conicalGradient.setColorAt(0.6,Qt::darkMagenta);
conicalGradient.setColorAt(1,Qt::drakBlue);
painter.setBrush(conicalGradient);
painter.drawEllipse(0,0,100,100);
---------------------------------
為了實(shí)現(xiàn)自定義填充,還可以使用QPixmap或者QImage對(duì)象進(jìn)行紋理填充。兩種圖像分別使用setTexture()和setTextureImage()函數(shù)加載紋理.
=========================================
雙緩沖繪圖
在Qt4中,所有的窗口部件默認(rèn)都使用雙緩沖進(jìn)行繪圖。使用雙緩沖,可以減輕繪制的閃爍感。在有些情況下,用戶(hù)要關(guān)閉雙緩沖,自己管理繪圖。下面的語(yǔ)句設(shè)置了窗口部件
的Qt::WA_PaintOnScreen屬性 ,就關(guān)閉了窗口部件的雙緩沖.
mywidget->setAttribute(Qt::WA_PaintOnScreen);
由于Qt4不再提供異或筆,組合模式QPainter::CompostionMode_Xor()并不是異或筆,Qt4只提供了QRubberBand實(shí)現(xiàn)矩形和直線的繪圖反饋。因此要實(shí)現(xiàn)在繪圖中動(dòng)態(tài)
反饋必須使用其他方法。程序中使用雙環(huán)沖來(lái)解決這個(gè)問(wèn)題。在繪圖過(guò)程中,一個(gè)緩沖區(qū)繪制臨時(shí)內(nèi)存,一個(gè)緩沖區(qū)保存繪制好的內(nèi)容,最后進(jìn)行合并。
在交互繪圖過(guò)程中,程序?qū)D像緩沖區(qū)復(fù)制到臨時(shí)緩沖區(qū),并在臨時(shí)緩沖區(qū)上繪制,繪制完畢在將結(jié)果復(fù)制到圖像緩沖區(qū),如果沒(méi)有交互復(fù)制,則直接將圖像緩沖區(qū)繪制顯示到屏幕上。
------------------------
使用alpha通道
在windows,Mac OSX和有XRender擴(kuò)展的X11系統(tǒng)上,Qt4能夠支持Alpha通道,通過(guò)使用Alpha通道,可以實(shí)現(xiàn)半透明效果,QColor類(lèi)中定義了Alpha通道的透明度,0表示完全透明
255表示完全不透明。注意QWidget類(lèi)有一個(gè)屬性windowOpacity,通過(guò)setWindowOpacity(qreal level)可以設(shè)置窗口的透明度。但該屬性和Alpha通道的原理并不相同,Qt4在
Windows和Mac OS X平臺(tái)上才支持該屬性,但在X11平臺(tái)上卻需要Composite擴(kuò)展才能工作。(alpha通道使用的是X11的xRender擴(kuò)展).
---------------------------------------
繪圖設(shè)備
QPaintDevice類(lèi)是實(shí)際的繪制設(shè)備的基類(lèi).QPainter能夠在QPaintDevice子類(lèi)上進(jìn)行繪制,如QWidget,QImage,QPixmap,QGLWidget,QGLPixelBuffer,QPicture,QPrinter
QSvgGenerator.要實(shí)現(xiàn)自己的繪圖設(shè)備,必須從QPaintDevice類(lèi)繼承并實(shí)現(xiàn)其虛函數(shù)QPaintDevice::paintEngine()以告之QPainter能夠在這個(gè)特定的設(shè)備上繪制圖形,同時(shí)還需要從
QPaintEngine類(lèi)繼承自定義的圖形繪制引擎。
1 QWidget
QWidget是所有用戶(hù)界面元素的基類(lèi),窗口部件時(shí)用戶(hù)界面的原子元素,他接受鼠標(biāo),鍵盤(pán),窗口系統(tǒng)的其他事件并在屏幕上繪制自己。
2 QImage
QImage類(lèi)提供了與硬件無(wú)關(guān)的圖像表示,它為直接操作像素提供優(yōu)化,QImage支持單色,8-bit,32-bit和alpha混合圖像,使用QImage的優(yōu)點(diǎn)在于可以獲得平臺(tái)無(wú)關(guān)的繪制操作,另外還有一個(gè)好處
時(shí)圖像可以不必在GUI線程中處理。
3 QPixmap
QPixmap時(shí)后臺(tái)顯示的圖像,它為在屏幕上顯示圖像提供優(yōu)化,不同于QImage,pixmap的圖像數(shù)據(jù)用戶(hù)不可見(jiàn),而且由底層窗口系統(tǒng)管理,為了優(yōu)化QPixmap圖像,Qt提供了QPixmapCache類(lèi)來(lái)存儲(chǔ)
臨時(shí)的pixmap.Qt還提供了QPixmap的繼承類(lèi)QBitmap類(lèi),QBitmap表示單色的pixmap,主要用來(lái)創(chuàng)建自定義的QCursor和QBrush對(duì)象,構(gòu)造QRegion對(duì)象,設(shè)置pixmap和窗口部件的掩碼。
4 OPenGLWidget
Qt提供了QtOpenGL模塊來(lái)實(shí)現(xiàn)OpenGL操作,QGLWidget允許使用OpenGL API進(jìn)行繪制。同時(shí)QGLWidget時(shí)QWidget的子類(lèi),因此QPainter也可以在上面繪制。這樣可以使Qt能夠利用OpenGl
完成繪制操作,如變換和繪制pixmap
5 pixel Buffer
QGLPixelBuffer從QPaintDevice繼承,封裝了OpenGL pbuffer.使用pbuffer繪制通常時(shí)全硬件加速,這比使用QPixmap繪制更為迅速。
6 FrameBuffer
QGLFrameBufferObject從QPaintDevice繼承,QGLFrameBufferObject封裝了OpenGL frameBuffer對(duì)象,FrameBuffer對(duì)戲那個(gè)用來(lái)實(shí)現(xiàn)后臺(tái)屏幕繪制,比pixel buffer更好一些。
7 picture
QPicture類(lèi)時(shí)能夠記錄和重演QPainter命令的繪圖設(shè)備,picture串行化painter的命令為平臺(tái)無(wú)關(guān)的格式,QPicture同時(shí)也于分辨率無(wú)關(guān),如QPicuture能夠在不同的設(shè)備上(svg,pdf,ps
打印機(jī)和屏幕)有一只的顯示。QPicture::load()和QPicture::save()函數(shù)分別完成載入和存儲(chǔ)圖像。
8 Printer
QPrinter 類(lèi)時(shí)在打印機(jī)上繪制的繪圖設(shè)備,在Windows和MAC OS X上,QPrinter使用內(nèi)建的打印機(jī)驅(qū)動(dòng)程序,在X11上,QPrinter山城postscript代碼并發(fā)送給lpr,lp或者其他打印程 序,QPrinter可以在任意其他QPrintEngine對(duì)象上打印,也可以直接生成PDF文件。
QPrintEngine類(lèi)定義了QPrinter如何和其他打印機(jī)系統(tǒng)交互的接口,主要?jiǎng)?chuàng)建自己的打印引擎時(shí),可以從QPaintEngine和QPaintEngine上繼承。
=========================================
坐標(biāo)系統(tǒng)與坐標(biāo)變換
1. Qt坐標(biāo)系統(tǒng)由QPainter控制,同時(shí)也由 QPaintDevice和QPaintEngine類(lèi)控制.QPaintDevice類(lèi)是繪圖設(shè)備的基 類(lèi),QWidget,QPixmap,QImage,和QPrinter都是QPaintDevice類(lèi)的子類(lèi)。Qt繪圖設(shè)備默認(rèn)坐標(biāo)原點(diǎn)是左上角,X軸 向右增長(zhǎng),Y軸向下增長(zhǎng),默認(rèn)的單位在基于像素的設(shè)備上是像素,在打印機(jī)設(shè)備上是1/72英寸(0.35毫米).QPainter的邏輯坐標(biāo)與 QPainterDevice的物理坐標(biāo)之間的映射由QPainter的變換矩陣,視口和窗口處理。邏輯坐標(biāo)和物理坐標(biāo)也是一直的。QPainter也支 持坐標(biāo)變換(如旋轉(zhuǎn)和伸縮);
2. 坐標(biāo)變換。
通常QPainer在設(shè)備的坐標(biāo)系統(tǒng)上繪制圖形,但QPainter也支持坐標(biāo)變換。可以通過(guò)QPainter::scale()函數(shù)進(jìn)行比例變換。使用 QPainter::rotate()函數(shù)進(jìn)行旋轉(zhuǎn)變換。平移變換則使用QPainter::translate()函 數(shù),QPainter::shear()函數(shù)對(duì)圖形進(jìn)行扭曲操作,所有變換操作的變換矩陣都可以通過(guò)QPainter::wordMatrix()函數(shù)取 出。不同的變換矩陣可以使用堆棧保存。
用QPainter::save()保存變換矩陣到堆棧,用QPainter::restore()函數(shù)將其彈出堆棧。
? QMatrix定義了系統(tǒng)的二維變換。QMatrix對(duì)象實(shí)際上定義了一個(gè)3x3矩陣。
? --------------
? m11? m12? 0
? m21? m22? 0
? dx?? dy?? 1
? ---------------
?? x//'=m11*x+m21*y+dx;
?? y//'=m22*y+m12*x+dy;
其中dx,dy表示水平和垂直偏移量,m11,m22表示水平和垂直方向上的比例。m12和m21表示水平和垂直方向上的扭曲程度。
矩陣可以通過(guò)setMatrix函數(shù)進(jìn)行設(shè)置,然后可以使用translate(),rotate(),scale(),shear()等函數(shù)進(jìn)行變 換.Qt4.3中引入QTransform類(lèi)表示變換矩陣。與QMatrix不同的是,QTransform()支持透視變換。使用toAffine() 函數(shù)可以將QTransform對(duì)象轉(zhuǎn)換為QMatrix對(duì)象。這將丟失QTransform的透視變換數(shù)據(jù)。邏輯坐標(biāo)和物理坐標(biāo)的變換由 QPainter的worldMatrix()函數(shù)。以及QPainter的viewport()和window()函數(shù)處理。視口表示物理坐標(biāo)下的任意 矩形。而在窗口表示在邏輯坐標(biāo)下的相同矩形。默認(rèn)情況下邏輯坐標(biāo)與物理坐標(biāo)時(shí)相同的。與繪圖設(shè)備上的矩形也是一致的。使用窗口-視口變換可以使邏輯坐標(biāo)符 合自定義要求,這個(gè)機(jī)制通常用來(lái)完成設(shè)備無(wú)關(guān)的繪圖代碼。例如,可以設(shè)置邏輯坐標(biāo)(-100,-100)到(100,100)且在原點(diǎn)(0,0),通過(guò)調(diào) 用QPainter::setWindow()函數(shù)可以完成下列操作。
?QPainter painter(this);
?painter.setWindow(QRect(-100,-100,200,200));
現(xiàn) 在,邏輯坐標(biāo)的(-100,-100)對(duì)應(yīng)著繪圖設(shè)備的(0,0),這樣可以繪制獨(dú)立于設(shè)備,始終在指定邏輯坐標(biāo)上工作。設(shè)置窗口或視口矩形實(shí)際上是執(zhí)行 線性變換。本質(zhì)上是窗口四個(gè)角映射到對(duì)應(yīng)的視口四個(gè)角,反之亦然,因此保持視口和窗口x軸和y軸之間的比例變換一致,保證變換沒(méi)有變形。窗口-視口變換只 是線性變換,不執(zhí)行裁剪操作,例如當(dāng)繪制超出窗口后,這些繪制仍然 通過(guò)線性變換映射到視口進(jìn)行繪制。Qt的繪制過(guò)程是進(jìn)行坐標(biāo)變換,在進(jìn)行窗口-視口變換。
=========================================
使用不同的字體
Qt提供了Font類(lèi)來(lái)表示字體,當(dāng)創(chuàng)建QFont對(duì)象時(shí),Qt會(huì)使用指定的字體,如果沒(méi)有對(duì)應(yīng)的字體,Qt將尋找一種最接近的已安裝字體。字體信息可以通過(guò)QFontInfo 取出,并可用QFontMetrics取得字體的相關(guān)數(shù)據(jù)。函數(shù)exactMatch()判斷底層窗口系統(tǒng)中是否有完全對(duì)應(yīng)的字體。使用 QApplication::setFont()可以設(shè)置應(yīng)用程序默認(rèn)的字體,如果選擇的字體不包括所有要顯示的字符,QFont將會(huì)嘗試尋找最基接近的 字體。當(dāng)QPainter繪制指定的字體中不存在的字符時(shí)將繪制一個(gè)空心的正方行。
繪圖路徑? --QPainterPath
繪圖路徑(painter path)由基本圖元(矩形,橢圓,直線,曲線)組成,繪圖路徑可以是閉合的路徑,如矩形和圓,或者是非閉合的路徑,如直線和曲線。繪圖路徑在Qt中使用QPainterPth類(lèi)表示,它提供了繪圖操作的容器,可以使圖形能夠復(fù)用。繪圖路徑可以進(jìn)行填充,顯示輪廓和裁剪。要生成可填充的輪廓的繪圖路徑,可以使用QPainterPathStroker類(lèi).使用QPainterPath的優(yōu)點(diǎn)是復(fù)雜的圖形只需創(chuàng)建一次,就可以多次使用。QPainterPath對(duì)象可以時(shí)只有起點(diǎn)的空路徑,或者從其他QPainterPath對(duì)象復(fù)制,創(chuàng)建了QPainterPath對(duì)象后,可以使用lineTo(),cubicTo(),quadTo() 函數(shù)將直線和曲線添加到路徑中來(lái),直線和曲線從currentPosition()開(kāi)始繪制。currentPosition()總是返回最后的子路經(jīng)繪 制的終點(diǎn)。使用moveTo()函數(shù)可以在不增加路徑的情況下移動(dòng)currentPositon(),它關(guān)閉了一個(gè)子路經(jīng),開(kāi)始一個(gè)新的子路經(jīng)。 closeSubPath()也可以關(guān)閉當(dāng)前路徑,并從currentPosition()連接一條直線到繪圖路徑的起點(diǎn)。QPainter可以使用 addEllipse(),addPath(),addRect(),addRegion(),addText()將Qt的一些基本圖元加入繪圖路徑。一 個(gè)已有的繪圖路徑可以通過(guò)connectPath()函數(shù)加入到另一個(gè)繪圖路徑中。
如下代碼繪制了一個(gè)箭頭:
QPainterPath path;
path.moveTo(10,100);
path.cubicTo(10,100,100,10,200,70);
path.lineTo(200,50);
path.lineTo(220,80);
path.lineTo(200,110);
path.lineTo(200,90);
path.cuticTo(200,100,100,50,50,100);
QPainter painter(this);
QPen pen(QColor(255,0,0),2);
painter.setPen(pen);
painter.drawPath(path);
Qt提供了兩種填充方式,Qt::OddEventFill和Qt::WindingFill.Qt::OddEvent時(shí)默認(rèn)的填充規(guī)則,它指定 QPainterPath使用奇偶填充規(guī)則,該規(guī)則判斷一個(gè)點(diǎn)是否在論經(jīng)圖形內(nèi)的方法是從該店畫(huà)一條水平線到路徑外,計(jì)算水平線和路徑的交點(diǎn)數(shù),如果交點(diǎn) 時(shí)奇數(shù)個(gè)則說(shuō)明該點(diǎn)在路徑圖形內(nèi)。QPainterPath還有一些函數(shù)可以獲取路徑信息,如elementAt()函數(shù)可以取出指定的子路經(jīng)元素,
isEmpty() 函數(shù)判斷當(dāng)前路徑是否為空。controlPointRect()函數(shù)返回路徑中所有的點(diǎn)和控制點(diǎn)的矩形,該函數(shù)運(yùn)行速度比返回精確包容框 boundingRect()函數(shù)快得多。contains()函數(shù)判斷一個(gè)點(diǎn)或一個(gè)矩形是否在路徑內(nèi)。intersects()判斷指定的矩形與路徑是 否相交.QPainterPath可以將矩形圖形轉(zhuǎn)換為其他圖形,如使用toFillPolygon(), toFillPolygon(),toSubpathPOlygons()函數(shù)將路徑轉(zhuǎn)化為多邊形。
QPainterPath還可以使用文字作為路徑,下面的代碼演示了文字路徑,并使用線性漸變填充。
QLinearGradient linearGrad(QPointF(200,0),QPointF(1000,0));
linearGrad.setColorAt(0,Qt::black);
linearGrad.setColorAt(1,Qt::white);
QFont font("隸書(shū)",80);
font.setBold(true);
QPainterPath textPath();
textPath.addText(200,300,font,tr("電子工業(yè)出版社"));
painter.setBrush(linearGrad);
painter.drawPath(textPath);
=========================================
QImage和QPixmap繪圖設(shè)備
Qt 提供了4個(gè)處理圖像的類(lèi)。QImage,QPixmap,QBitmap,QPicure.他們有著各自的特點(diǎn)。QImage優(yōu)化了I/O操作,可以直接 存取操作像素?cái)?shù)據(jù)。QPixmap主要用來(lái)在屏幕上顯示圖像。QBitmap從QPixmap繼承,只能表示兩種顏色,QPicture是可以記錄和重放 QPrinter命令的類(lèi)。QImage提供了與硬件無(wú)關(guān)的圖像表示方法。通過(guò)QImage可以直接存取像素?cái)?shù)據(jù),QImage也可以用作繪圖設(shè)備。
QImage 支持的圖像顏色可以是單色,8位,32位和alpha混合的格式。因?yàn)镼Image從QPainterDevice繼承,所以QPainter可以直接在 QImage上繪圖。除了繪制文字格式外(QFont依賴(lài)于底層的GUI).其他的繪制操作可以在任意線程中完成,如果要在其他線程中繪制文字,可以使用 QPainterPath。QImage對(duì)象具有隱式共享,作為傳值參數(shù),可以使用數(shù)據(jù)流及進(jìn)行比較等特性。
讀入圖像可以通過(guò)QImage構(gòu)造函 數(shù),load(),loadFromData()幾種方法完成。還可以通過(guò)QImage的靜態(tài)函數(shù)fromData()由指定數(shù)據(jù)構(gòu)造一個(gè)QImage對(duì) 象。既可以從文件系統(tǒng)裝入,也可以從Qt應(yīng)用程序的嵌入式資源中讀取,使用save()可以保存QImage對(duì)象。可以通過(guò) QImageReader::supportedImageFormats()和 QImageWriter::supportedImageFormats()獲取QImage支持的所有文件格式列表。
---------------------------------
QImage函數(shù)
---------------------------------
幾何函數(shù)
size(),widt(),dotsPermeterX(),dotsPerMeterY()函數(shù)獲取圖像大小和比例信息。
rect()函數(shù)返回圖像的包容矩形,valid()測(cè)試給定的坐標(biāo)是否在此矩形內(nèi)。offset()獲取圖像和其他圖像之間的相對(duì)偏移量。setOffset()函數(shù)設(shè)置偏移量。
顏色函數(shù)
某個(gè)像素的顏色可以通過(guò)pixel函數(shù)獲取,返回值是QRgb類(lèi)型,對(duì)于單色和256色圖像,colorTable()返回調(diào)色板,numColors返回調(diào)色板中的條目數(shù).
用pixelIndex()函數(shù)獲取像素的顏色索引,然后使用color()函數(shù)取出實(shí)際的顏色值.hasAlphaChannel()函數(shù)返回圖像是否使用了alpha通道。allGray(),isGrayscale()測(cè)試圖像是否為灰度圖像。
文字
text()函數(shù)返回圖像附屬的文字,textKeys()返回文字的鍵值表。setText()函數(shù)改變圖像附屬文字.
低級(jí)信息
depth()函數(shù)獲取圖像顏色位數(shù).支持1,8,32位.format().bytesPerLine()和numBytes()函數(shù)返回圖像的數(shù)據(jù)存儲(chǔ)信息. serieralNumber()函數(shù)取得唯一標(biāo)識(shí)QImage對(duì)象的數(shù)字.
----------------------------------
QImage的8位和單色圖像采用顏色索引表的方式存取,32為的圖像則直接存儲(chǔ)ARGB值.因此他們的像素操作函數(shù)也不相同,對(duì)32位的圖像,setPixel()函數(shù)可以改變指定像素的QRgb顏色值,對(duì)8位和單色圖像,setPixel()改變?cè)陬A(yù)定義顏色表中的索引值,如果要改變顏色表,可以使用setColor()函數(shù)。QImage提供 scanLine()函數(shù)返回指定行的數(shù)據(jù)。bits()函數(shù)返回第一個(gè)像素的指針。每個(gè)像素在QImage中都使用整數(shù)形式表示。單色圖像使用一位的索 引指向只有兩種顏色的調(diào)色板,有兩種類(lèi)型的單色圖像,big endia(MSB),little endian(LSB).256色圖像使用8位顏色調(diào)色板,調(diào)色板的數(shù)據(jù)類(lèi)型是QVector,QRgb實(shí)際上時(shí)無(wú)符號(hào)整數(shù)型,存儲(chǔ)ARGB的格式是 0xAARRGGBB.32位的圖像直接存儲(chǔ),有三種類(lèi)型的存儲(chǔ)格式:RGB,ARGB和已預(yù)乘的ARGB。在已預(yù)乘ARGB中,紅綠藍(lán)三色已經(jīng)和 alpha相乘并模除255.allGray()和isGrayscale()函數(shù)可以判斷一個(gè)彩色圖像能否安全轉(zhuǎn)化為灰度圖像。圖像的格式用 format()函數(shù)讀取出,convertToFormat()可以進(jìn)行圖像格式轉(zhuǎn)化,QImage支持的存儲(chǔ)格式如下:
QImage::Format_Mono??????????? 單色圖像(MSB)
QImage::Format_MonoLSB???????? 單色圖像(LSB)
QImage::Format_Indexed8??????? 使用顏色表的256色圖像
QImage::Format_RGB32?????????? 不支持Alpha通道的32位圖像
QImage::FOrmat_ARGB32????????? 含Alpha通道的32位圖像
QImage::Format_ARGB32_Premultiplied?? 已預(yù)乘的含Alpha通道的32位圖像.
總結(jié)
以上是生活随笔為你收集整理的QT技术应用_2D绘图(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习大讲堂:深度学习在目标跟踪中的应
- 下一篇: 机器学习笔记九之支持向量机