QPainter用來進行繪圖操作的類。繪圖設(shè)備一般包括Qwidget、Qpixmap、QImage.他們提供給QPainter畫布。
QPaintDevice是一個可以使用QPainter進行繪圖的抽象二維界面。
QPaintEngine給QPainter提供在不同設(shè)備上繪圖的接口,QPaintEngine類由QPainter和QPaintDevice內(nèi)部使用,應(yīng)用程序一般無需使用QPaintEngine。
繪圖設(shè)備包括QWidget、QPixmap、QImage等。
paintEvent世界和繪圖區(qū)
QWidget類及其子類是最常用的繪圖設(shè)備,從QWidget類繼承的類都有paintEvent()事件,只需要重定義此事件就行。??相當(dāng)于windows mfc的onpaint函數(shù)。
只要窗口部件需要被重繪就被調(diào)用。是repaint()或update()的結(jié)果。 幾次調(diào)用update()的結(jié)果通常僅僅是一次paintEvent()調(diào)用。 Qt通常在paintEvent()調(diào)用之前擦除這個窗口部件的區(qū)域。
update()相當(dāng)于 mfc 的invalidate();迫使paintEvent虛函數(shù)被調(diào)用。
QWidget繪圖區(qū)就是其窗口內(nèi)部區(qū)域。坐標(biāo)系統(tǒng)的單位是像素。左上角坐標(biāo)為(0,0)。這個坐標(biāo)系統(tǒng)是物理坐標(biāo),稱為視口(viewport)坐標(biāo)。
高度:QWidget::height()
寬度:QWidget::width()
設(shè)置qwidget窗口大小的函數(shù)
1.setMinimumSize? setMaximumSize
2.resize
3.setFixedSize
QPainter繪圖主要屬性QPen:畫筆,用于控制線條的顏色、寬度等。? ?
setPen、setStyle(線條樣式)、setCapStyle(線條端點樣式)、setJoinStyle(線條連接樣式)
QBrush:畫刷,用于填充顏色、漸變特性等。
setBrush、setStyle(填充樣式)
漸變色:
線性漸變:QLinearGradient
輻射漸變:QRadialGradient
圓錐形漸變:QConicalGradient
//線性漸變
QLinearGradient linearGrad(0,0,100,0);//從左到右,
linearGrad.setColorAt(0,Qt::yellow);//起點顏色
linearGrad.setColorAt(1,Qt::green);//終點顏色
linearGrad.setSpread(QGradient::PadSpread); //展布模式
painter.setBrush(linearGrad);
QFont:字體屬性,用于繪制文字時,設(shè)置文字的樣式、大小等?
setFont
繪圖
點:drawPoint()、drawPoints()、
線:drawLine()、
區(qū)域:drawRect()
文本:drawText()
Qt提供了處理圖像數(shù)據(jù)的類:QImage, QPixmap和QPicture。
drawPicture: QPicture?
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 picture;
QPainter painter;
picture.load("drawing.pic");
painter.begin(this);
painter.drawPicture(0,0,picture);
painter.end();
drawPixmap:? ?QPixmap
QPixmap繪圖依賴硬件,QPixmap的設(shè)計本來就是用來加速顯示,用paint繪圖時用QPixmap會比其他類的效果好很多。一般小圖片用QPixmap加載,和平臺相關(guān)(在不同的平臺可能繪制出的效果不一樣)。QPixmap上繪圖比較慢,但顯示它則比較快(使用GPU處理,相對減輕了CPU的負擔(dān)).
可以直接使用構(gòu)造函數(shù),關(guān)聯(lián)資源 ,如?QPixmap(":/res/python.jpg");也可以使用load、save進行加載或保存。
load() | 加載圖像文件作為QPixmap對象 |
save() | 將QPixmap對象保存為文件 |
QRect rect1(0,0,100,100);
paint.drawPixmap(rect1,QPixmap(tr(":/res/about.png")));
drawImage? ?QImage
QImage類提供了一個獨立于硬件的圖像表示,它允許直接訪問像素數(shù)據(jù),并且可以用作繪制設(shè)備;適合加載大圖片;可以在線程中繪圖,可以優(yōu)化UI響應(yīng)時間。繪制圖片出來的效果和平臺無關(guān),QImage上繪圖比較快,但顯示它則比較慢。
QImage的基本函數(shù)的使用與QPixmap類似,可以直接使用構(gòu)造函數(shù),關(guān)聯(lián)資源
QRect rect2(100,0,100,100);
paint.drawImage(rect2,QImage(tr(":/res/about.png")));
QPixmap與QImage的區(qū)別:
QPixmap依賴于硬件,QImage不依賴于硬件。
QPixmap主要是用于繪圖,針對屏幕顯示而最佳化設(shè)計,QImage主要是為圖像I/O、圖片訪問和像素修改而設(shè)計的。
當(dāng)圖片小的情況下,直接用QPixmap進行加載,畫圖時無所謂,當(dāng)圖片大的時候如果直接用QPixmap進行加載,會占很大的內(nèi)存,一般一張幾十K的圖片,用QPixmap加載進來會放大很多倍。
所以一般圖片大的情況下,用QImage進行加載,然后轉(zhuǎn)乘QPixmap用戶繪制。QPixmap繪制效果是最好的。
QImage image = pixmap.toImage();
QPixmap pixmap = QPixmap::fromImage(image);
坐標(biāo)平移:translate
坐標(biāo)旋轉(zhuǎn):rotate
縮放:scaled
狀態(tài)保存?save
狀態(tài)恢復(fù)?? ?restore
恢復(fù)所有操作: resetTransform
坐標(biāo)
物理坐標(biāo):
即視口坐標(biāo),setviewport? 默認(rèn)情況下,視口等于繪圖設(shè)備的整個矩形區(qū)。單位為像素、
邏輯坐標(biāo):
窗口坐標(biāo),中心為原點(0,0)setwindow? 如果想不用管實際物理坐標(biāo)范圍大小,可通過設(shè)置成窗口坐標(biāo)來繪圖。這是設(shè)備大小變化時,繪制的圖片也自動變化大小。
調(diào)用setwindow后,后面用到的坐標(biāo)都是按邏輯坐標(biāo)來算了的。是按比例縮放
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
int W=width();
int H=height();
int side=qMin(W,H);//去長和寬的小值
QRect rect((W-side)/2, (H-side)/2,side,side); //viewport矩形區(qū)
painter.drawRect(rect); //Viewport大小
painter.setViewport(rect);//設(shè)置Viewport
painter.setWindow(-100,-100,200,200); // 設(shè)置窗口大小,邏輯坐標(biāo)
painter.setRenderHint(QPainter::Antialiasing);
//設(shè)置畫筆
QPen pen;
pen.setWidth(1); //線寬
pen.setColor(Qt::red); //劃線顏色
//Qt::NoPen,Qt::SolidLine, Qt::DashLine, Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
pen.setStyle(Qt::SolidLine);//線的類型,實線、虛線等
//Qt::FlatCap, Qt::SquareCap,Qt::RoundCap
pen.setCapStyle(Qt::FlatCap);//線端點樣式
//Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin,Qt::SvgMiterJoin
pen.setJoinStyle(Qt::BevelJoin);//線的連接點樣式
painter.setPen(pen);
painter.setCompositionMode(QPainter::CompositionMode_Difference);
for(int i=0; i<36;i++)
{
painter.drawEllipse(QPoint(50,0),50,50);
painter.rotate(10);
}
}
裁剪區(qū)域? ?setClipRegion
延伸:設(shè)置widget的背景圖片的辦法
1.在paintEvent事件中繪制圖片
void Widget::paintEvent(QPaintEvent * ev)
{
QPainter painter(this);
painter.drawPixmap(rect(),QPixmap(":/bg.jpg"),QRect());
}
缺點就是要使用paintEvent事件需要新建一個類,不適合子窗口
2.使用調(diào)色板QPalette來設(shè)置圖片
QPalette pal =this->palette();
pal.setBrush(QPalette::Background,QBrush(QPixmap(":/bg.jpg")));
setPalette(pal);
3.使用樣式表(setStyleSheet)
setStyleSheet("border-image:url(:/bg.jpg)");
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧