詳細描述:
QPainter類提供了許多高度優化的函數去做大部分的GUI繪制工作。它可以畫從簡單的線到復雜的形狀。通常情況下,QPainter的使用是在widget當中的painter事件使用。記得在執行完之后要及時銷毀QPainter的對象。
void SimpleExampleWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setPen(Qt::blue); painter.setFont(QFont("Arial", 30)); painter.drawText(rect(), Qt::AlignCenter, "Qt"); }
你可以使用painter不同的composition mode將圖片結合在一起。
一個painter被通過begin()函數被激活並且使用一個QPainterDevice參數的構造函數進行構造,調用end()函數和析構函數解除
激活。
結合QPaintDevice和QPaintEngine,我們知道,QPainter執行的是一個畫圖的操作,QPaintDevice代表的是能被QPainter畫上去
的設備。
QPaintEngine提供接口使得QPainter能夠畫在不同類型的設備上。當painter被激活的時候,device()函數返回paint設備,paint
Engine()返回一個當前painter正在繪制的engine。
有時候在一個特殊的QPaintDevice上繪制也是可取的,QPainter提供了這樣的函數setRedirected()來做這件事。
當被繪制的設備是一個widget的時候,QPainter只能在paintEvent()函數中或者被該函數調用的函數當中使用,除非Qt::WA_Paint
OutsidePaintEvent 這個widget屬性被設置。而在mac osx或者windows當中,無論該屬性有沒有設置,painter都必須在paint
Event()函數當中使用。
Settings
QPainter有許多的設置可以用來滿足你的個人偏愛。
font():字體設置。
brush():畫刷設置,定義顏色或者模式(pattern)來填充形狀。
pen():定義顏色和點描來繪制線或者邊框。
backgroundMode():來表示是否有一個background()函數。
background(): 只在backgroundMode()為Qt::OpaqueMode和 pen()是點描的時候有效。
brushOrigin():定義使用的刷子的來源,通常與widget的背景保持一致。
viewport(),window(),worldTransform()用來轉換坐標變換。
hasClipping():表示painter是否綁定在某個設備上,該設備也被綁定。
layoutDirection():當繪制文本的時候定義布局方向。
worldMatrixEnable(),viewTransformEnable()描述轉換坐標是否允許。
我們可以隨時使用save()函數來保存QPainter的狀態,並且用restore()函數來使他們回退。
Drawing
drawPoint(),drawPoints(), drawLine(), drawRect(), drawRoundedRect(),drawEllipse(), drawArc(), drawPie(),
drawChord(), drawPolyline(),drawPolygon(), drawConvexPolygon() 和 drawCubicBezier().
QPainter類也提供了fillRect()函數用來調用QBrush填充提供的QRect。
如果你需要畫一些很復雜的圖形,或者需要做一些重復性的工作,可以考慮建立一個QPainterPath並且使用drawPath()來調用。
QPainter也提供了fillPath()和stokePath來繪制外形。
在QPainterPath上使用矢量繪圖技術,可以做出許多特殊的圖形,也可以使用自定義的patterns來繪制自己的圖形。
~有許多的函數可以用來畫圖(pixmaps/images),我們稱之為drawPixmap(),drawImage()和drawTiledPixmap()。
drawText()繪制文本,drawPicture()會忽視所有的painter設置,而使用picture自己的設置。
Rendering Quality渲染質量
使用QPainter能夠優化渲染結果,QPainter::Antialiasing用來反鋸齒等。
Coordinate Transformations坐標轉換
最常用的坐標轉換有放大縮小,旋轉,剪切,移動等,scale(),rotate(),translate(),shear()函數。
Compositon Mode復合方式
一個像素覆蓋在另外一個像素上面的時候的復合方式。常用的兩個復合方式是Source和SourceOver,前者用於在設備上繪制不透明的對象,
后者來說,源是透明的並且畫在目標像素之上。
注意到復合轉換在於對像素的聰明操作,在圖像上和圖像矩形范圍內就有了區別,在矩形邊框上的像素alpha=0的話,這些像素就會覆蓋在其
他圖像的像素之上。
Limitations
用qt基於光柵的坐標系,+/-(2^15)能用。應為用於表示坐標長的是的short int類型。
當用qt的stoker生成的彎曲曲線的外形時,僅僅是一種近似。
Performance
QPainter是一個豐富的框架,允許開發者做許許多多的圖像操作,比如傾斜度,復合模式,矢量繪圖等,並且QPainter能夠這樣子在許多的
不相同的硬件和軟件棧之上工作。自然的,軟件和硬件的基本組合有許多對性能的影響。要使得在這一系列的組合當中所有的繪圖操作都盡可
能的快幾乎是不可能的,因為需要巨大的工作量,所以,折中的方式是我們選擇了一些QPainter API和后端的子集,確保能夠在給定的軟硬件
組合上盡可能好的使用。
那些被我們所關注的高性能的引擎有:
Raster:該后端在純軟件中實現了所有的渲染,也經常被用在QImages當中渲染,具有優化性能的包括 QImage::Format_ARGB32_Pre
multiplied,QImage::Format_RGB32或者 QImage::Format_RGB16,其他的格式化,在性能上都會顯著惡化。
OpenGL 2.0(ES):這是圖像硬件加速的主要后端。他能夠在支持OpenGL2.0或者OpenGL/ES2.0規范的設備當中或者桌面系統當運
行。該規范得到了最近幾年大部分的圖形芯片制造廠商的支持。引擎支持QGLWidget上使用QPainter或者輸入在底層的系統中輸入
-graphicssystem opengl。
OpenVG:支持OpenVG引擎。
這些操作包括:簡單的轉換,移動,縮放,或者直角的旋轉。
drawPixmap():在軟硬件組合上不透明的,飛光滑轉換方式的簡單變換。
矩形的實色填充,雙色漸變和簡單的線性變換。矩形的裁剪。像素組合方式。等
Menber Function Documentation(我挑幾個重要的函數翻譯)
QPainter::QPainter()
構造函數。
QPainter::QPainter(QPainterDevice*device)
構造一個painter開始在設備上進行繪制。
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter p;
p.begin(this);
p.drawLine(...); // drawing code
p.end();
/*和QPainter p(this)相同。*/ }
bool QPainter::begin(QPaintDevice *device)
使用該函數時要注意以下情況:
painter->begin(0); // 繪制設備不可能為0;
QPixmap image(0, 0);
painter->begin(&image); // 圖像為空,這句話錯誤 painter->begin(myWidget); painter2->begin(myWidget); //同一個時間內不能夠出現兩個painter對象。
void QPainter::drawConvexPolygon(const QPointF *points,int pointCount)
繪制多邊形函數。
在一些平台上,drawConvexPlygon()函數能夠比drawPloygon()函數更加快速。
void QPainter::drawEllipse(const QRectF&rectangle)
繪制橢圓。
void QPainter::drawImage(const QRectF &target,const QImage &image,const QRectF &source,Qt::ImageConversion-
Flag flags=Qt::AutoColor)
把矩形部分源的畫畫到目標的矩形之中。
該函數有許多不相同的構造函數,比如void QPainter::drawImage(const QRectF &rectangle,const QImage &image)
該函數圖片會知道所給的矩形當中,並且圖片會自己縮放以滿足矩形框的大小(除非額外設定)。
類似於上面的函數還有drawPixmap()。
void QPainter::drawPoint();畫點函數。void QPainter::drawRects()畫矩形。void QPainter::drawText()畫文本
等等。將來在對Qt裁剪的過場當中,我們要對Qt深入的了解。QT的demo當中有非常棒的example可以學習。要學會看別人的代碼。
http://blog.csdn.net/madao123/article/details/5938453