Qt自定義控件實(shí)現(xiàn)多彩色儀表盤
本文實(shí)例為大家分享了Qt實(shí)現(xiàn)多彩色儀表盤的具體代碼,供大家參考,具體內(nèi)容如下
Qt自定義控件4:多彩色儀表盤
先看效果圖:
思路:外圍三色的圓弧 紅:藍(lán):綠 = 1:2:1,總共占270度??潭染€是根據(jù)所在圓弧的顏色而畫,刻度線的角度也是根據(jù)坐標(biāo)系的旋轉(zhuǎn)而畫??潭戎凳歉鶕?jù)刻度線的角度得到所要畫的刻度的左上角的坐標(biāo),然后構(gòu)成一個(gè)矩形,根據(jù)矩形畫出刻度值。指針是根據(jù)四個(gè)點(diǎn)的坐標(biāo)直接畫的四邊形,再旋轉(zhuǎn)坐標(biāo)系實(shí)現(xiàn)指針旋轉(zhuǎn)的效果。下方的文字直接得到坐標(biāo)橫縱坐標(biāo)位置得到矩形畫出value的值
關(guān)鍵代碼:CMPassrate3.cpp
void CMPassrate3::paintEvent(QPaintEvent *event){ int width = this->width(); int height = this->height(); int side = qMin(width, height); QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); painter.translate(width / 2, height / 2); painter.scale(side / 200.0, side / 200.0); drawBG(&painter); drawE(&painter); drawLine(&painter); drawText(&painter); drawBootomText(&painter); drawPoint(&painter); } void CMPassrate3::drawE(QPainter* painter){ painter->setPen(Qt::NoPen); QRect rectOut(-outRadius,-outRadius,2*outRadius,2*outRadius); QRect rectInn(-innRadius,-innRadius,2*innRadius,2*innRadius); painter->save(); painter->setBrush(QColor("#04EEB2")); QPainterPath path; path.arcTo(rectOut,-45,270.0/4); QPainterPath subPath; subPath.addEllipse(rectInn); path -= subPath; painter->drawPath(path); painter->restore(); painter->save(); QPainterPath bluePath; QPainterPath blueSubPath; painter->setBrush(QColor("#2DC5F6")); bluePath.arcTo(rectOut,-45+(270.0/4),270.0/2); blueSubPath.addEllipse(rectInn); bluePath -= blueSubPath; painter->drawPath(bluePath); painter->restore(); painter->save(); QPainterPath redPath; QPainterPath redSubPath; painter->setBrush(QColor("#FA468C")); redPath.arcTo(rectOut,-45+270.0*3/4,270.0/4); redSubPath.addEllipse(rectInn); redPath -= redSubPath; painter->drawPath(redPath); painter->restore(); } void CMPassrate3::drawLine(QPainter* painter){ painter->save(); painter->rotate(135); //270/8度一格 for(int i = 0;i<9;i++){ if(i<3){ painter->setPen(QColor("#FA468C")); }else if(i<6){ painter->setPen(QColor("#2DC5F6")); }else{ painter->setPen(QColor("#04EEB2")); } QLine line(QPoint(lineStart,0),QPoint(innRadius,0)); painter->drawLine(line); painter->rotate(270.0/8); } painter->restore(); } void CMPassrate3::drawPoint(QPainter* painter){ const QPoint point[4]{ QPoint(0,0),QPoint(0,6),QPoint((lineStart-3)*qCos(135*3.14/180),(lineStart-3)*qSin(135*3.14/180)),QPoint(-6,0) }; float range = 270.0/100*value; painter->save(); painter->setBrush(QColor("#C2E481")); painter->rotate(range); painter->drawConvexPolygon(point,4); painter->restore(); } void CMPassrate3::drawBG(QPainter* painter){//可以自行添加背景圖片實(shí)現(xiàn)更加精美的效果 // painter->save(); // QImage image(":/image/images/bg1.jpg"); // QRect rect(-this->width(),-this->height(),this->width()*2,this->height()*2); // painter->drawImage(rect,image); // painter->restore(); } void CMPassrate3::drawText(QPainter *painter){ painter->save(); //初始為 painter->setPen(Qt::black); QFont font = painter->font(); font.setPixelSize(8); painter->setFont(font); float x,y; for(float i =0;i<=100;i+=12.5){ x = lineStart*qCos((135+(270.0/8)*((i+1)/12.5))*3.14/180); y = lineStart*qSin((135+(270.0/8)*((i+1)/12.5))*3.14/180); QRect rect; if(i<50){ rect.setX(x); rect.setY(y); }else if(i>50){ rect.setX(x-17); rect.setY(y-7); }else{ rect.setX(x); rect.setY(y); } rect.setWidth(17); rect.setHeight(10); painter->drawText(rect,Qt::AlignCenter,QString::number(i)); } painter->restore(); } void CMPassrate3::drawBootomText(QPainter *painter){ painter->save(); painter->setPen(Qt::black); QFont font = painter->font(); font.setPixelSize(25); painter->setFont(font); painter->translate(0,outRadius-12); int length = 20; QRect rect(-length,-length,length*2,length*2); painter->drawText(rect,Qt::AlignCenter,QString::number(value)); painter->restore(); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)產(chǎn)生隨機(jī)數(shù)和相應(yīng)的猜拳小游戲?qū)嵗a
C++中沒(méi)有自帶的random函數(shù),要實(shí)現(xiàn)隨機(jī)數(shù)的生成就需要使用rand()和srand()。下面這篇文章主要給大家介紹了關(guān)于C++實(shí)現(xiàn)產(chǎn)生隨機(jī)數(shù)和相應(yīng)的猜拳小游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09C語(yǔ)言中設(shè)置進(jìn)程優(yōu)先順序的方法
這篇文章主要介紹了C語(yǔ)言中設(shè)置進(jìn)程優(yōu)先順序的方法,包括setpriority()函數(shù)和getpriority()函數(shù)以及nice()函數(shù),需要的朋友可以參考下2015-08-08關(guān)于C語(yǔ)言操作符的那些事(超級(jí)全)
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言操作符的那些事兒,c語(yǔ)言的操作符有很多,包括算術(shù)操作符、移位操作符、位操作符、賦值操作符、單目操作符、關(guān)系操作符、邏輯操作符、條件操作符、逗號(hào)表達(dá)式、下標(biāo)引用、函數(shù)調(diào)用和結(jié)構(gòu)成員,需要的朋友可以參考下2021-08-08