本文實例為大家分享了Qt自定義控件實現進度儀表盤的具體代碼,供大家參考,具體內容如下
先看效果圖:
思路:外圍的線共100根(自定義,可改變),總共占270度,然后按照 先畫一條線然后旋轉坐標系的思路畫出完整的線。內部即是一個灰色的背景圓,一個圓弧和中間的value對應的文字。
關鍵代碼:CMPassrate2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
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; //自定義所有的線加起來占270度,100條線 painter->rotate(135); //旋轉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(); } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/parkchorong/article/details/102538818