雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊:

本文實(shí)例為大家分享了Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤的具體代碼,供大家參考,具體內(nèi)容如下

先看效果圖:


思路:外圍的線共100根(自定義,可改變),總共占270度,然后按照 先畫一條線然后旋轉(zhuǎn)坐標(biāo)系的思路畫出完整的線。內(nèi)部即是一個(gè)灰色的背景圓,一個(gè)圓弧和中間的value對(duì)應(yīng)的文字。

關(guān)鍵代碼:CMPassrate2.cpp

void CMPassrate2::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);

 drawBGE(&painter); //畫背景圓
 drawTextE(&painter);//畫文字所在圓弧
 drawText(&painter);//畫文字
 drawLines(&painter);//畫最外部的線
}

void CMPassrate2::updateValue(float value){//提供給外部的方法,用于更新value
 this->value = value;
 update();//每次更新value后,都重繪界面
}
void CMPassrate2::drawLines(QPainter* painter){
 painter->save();
 QPen pen;
 pen.setColor(QColor("#A7DD42"));
 pen.setWidth(2);
 painter->setPen(pen);

 float range = 270.0/lineCount; //自定義所有的線加起來(lái)占270度,100條線
 painter->rotate(135);//旋轉(zhuǎn)135度,開始畫線,總共畫270度。
 QLine line(QPoint(outLineRadius,0),QPoint(innLineRadius,0));
 for(int i = 1;i<=lineCount;i++){
  if(i>value){
   QPen pen;
   pen.setColor(QColor("#D7D7D7"));
   pen.setWidth(2);
   painter->setPen(pen);
  }
  painter->drawLine(line);
  painter->rotate(range);
 }
 painter->restore();
}
void CMPassrate2::drawBGE(QPainter* painter){
 painter->save();
 painter->setPen(Qt::NoPen);
 painter->setBrush(QColor("#EAEAEA"));
 QRect rect(-bgERadius,-bgERadius,bgERadius*2,bgERadius*2);
 painter->drawEllipse(rect);
 painter->restore();
}
void CMPassrate2::drawTextE(QPainter* painter){
 painter->save();
 painter->setPen(Qt::NoPen);
 painter->setBrush(QColor("#2DC877"));

 QPainterPath path;
 QRect rectOut(-textOutRadius,-textOutRadius,textOutRadius*2,textOutRadius*2);
 path.arcTo(rectOut,0,360);

 QPainterPath subPath;
 QRect rectInn(-textInnRadius,-textInnRadius,textInnRadius*2,textInnRadius*2);
 subPath.addEllipse(rectInn);
 path -= subPath;
 painter->drawPath(path);
 painter->restore();
}
void CMPassrate2::drawText(QPainter* painter){
 painter->save();
 painter->setPen(QColor("#62A0DB"));
 QRect rectInn(-textInnRadius,-textInnRadius,textInnRadius*2,textInnRadius*2);
 QFont font = painter->font();
 font.setPixelSize(textSize);
 painter->setFont(font);
 painter->drawText(rectInn,Qt::AlignCenter,QString::number(value));
 painter->restore();
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。

上一篇:C語(yǔ)言從代碼中加載動(dòng)態(tài)鏈接庫(kù)過(guò)程解析

欄    目:C語(yǔ)言

下一篇:C語(yǔ)言實(shí)現(xiàn)電話簿管理系統(tǒng)

本文標(biāo)題:Qt自定義控件實(shí)現(xiàn)進(jìn)度儀表盤

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/57.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有