QPainter類學習


詳細描述:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM