navprogress.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. #include "navprogress.h"
  2. NavProgress::NavProgress(QWidget *parent) : QWidget(parent), navStyle(NavStyle_JD), maxStep(3), state(0) {
  3. background = Qt::gray;
  4. foreground = Qt::white;
  5. firstCircleGreen = false;
  6. firstCircleBlinking =false;
  7. secondCircleGreen = false;
  8. secondCircleBlinking = false;
  9. thridCircleGreen = false;
  10. thridCircleBlinking = false;
  11. topInfo = {"组网", "充电", "起爆"};
  12. blinkTimer = new QTimer(this);
  13. connect(blinkTimer, &QTimer::timeout, this, &NavProgress::toggleBlinkColors);
  14. blinkColor = Qt::red;
  15. secondBlinkColor = Qt::red;
  16. qDebug()<<"width"<<this->width();
  17. }
  18. void NavProgress::setNavStyle(NavStyle style) {
  19. navStyle = style;
  20. update();
  21. }
  22. void NavProgress::setMaxStep(int step) {
  23. maxStep = step;
  24. update();
  25. }
  26. void NavProgress::setTopInfo(const QVector<QString>& info) {
  27. topInfo = info;
  28. update();
  29. }
  30. void NavProgress::setFirstCircleGreen(bool green) {
  31. firstCircleGreen = green;
  32. update();
  33. }
  34. void NavProgress::setFirstCircleBlinking(bool blinking) {
  35. firstCircleBlinking = blinking;
  36. if (blinking) {
  37. blinkTimer->start(500);
  38. } else {
  39. blinkTimer->stop();
  40. update();
  41. }
  42. }
  43. QVector<QColor> NavProgress::getCircleColors() {
  44. QVector<QColor> colors;
  45. for (int i = 0; i < maxStep; i++) {
  46. if (i == 0 && firstCircleGreen) {
  47. colors.append(Qt::green);
  48. } else {
  49. colors.append(background);
  50. }
  51. }
  52. return colors;
  53. }
  54. void NavProgress::toggleBlinkColors() {
  55. blinkColor = (blinkColor == Qt::red)? Qt::gray : Qt::red;
  56. if (secondCircleBlinking) {
  57. secondBlinkColor = (secondBlinkColor == Qt::red)? Qt::gray : Qt::red;
  58. }
  59. if (thridCircleBlinking) {
  60. secondBlinkColor = (secondBlinkColor == Qt::red)? Qt::gray : Qt::red;
  61. }
  62. update();
  63. }
  64. void NavProgress::setState(int newState) {
  65. state = newState;
  66. switch (state) {
  67. case 0:
  68. firstCircleGreen = false;
  69. firstCircleBlinking = false;
  70. secondCircleBlinking = false;
  71. secondCircleGreen = false;
  72. thridCircleBlinking = false;
  73. thridCircleGreen = false;
  74. blinkTimer->stop();
  75. break;
  76. case 1:
  77. firstCircleGreen = false;
  78. firstCircleBlinking = true;
  79. secondCircleBlinking = false;
  80. secondCircleGreen = false;
  81. thridCircleBlinking = false;
  82. thridCircleGreen = false;
  83. blinkTimer->start(500);
  84. break;
  85. case 2:
  86. firstCircleGreen = true;
  87. firstCircleBlinking = false;
  88. secondCircleBlinking = false;
  89. secondCircleGreen = false;
  90. thridCircleBlinking = false;
  91. thridCircleGreen = false;
  92. break;
  93. case 3:
  94. firstCircleGreen = true;
  95. firstCircleBlinking = false;
  96. secondCircleBlinking = true;
  97. secondCircleGreen = false;
  98. thridCircleBlinking = false;
  99. thridCircleGreen = false;
  100. blinkTimer->start(500);
  101. break;
  102. case 4:
  103. firstCircleGreen = true;
  104. firstCircleBlinking = false;
  105. secondCircleBlinking = false;
  106. secondCircleGreen = true;
  107. thridCircleBlinking = false;
  108. thridCircleGreen = false;
  109. break;
  110. case 5:
  111. firstCircleGreen = true;
  112. firstCircleBlinking = false;
  113. secondCircleBlinking = false;
  114. secondCircleGreen = true;
  115. thridCircleBlinking = true;
  116. thridCircleGreen = false;
  117. blinkTimer->start(500);
  118. break;
  119. case 6:
  120. firstCircleGreen = true;
  121. firstCircleBlinking = false;
  122. secondCircleBlinking = false;
  123. secondCircleGreen = true;
  124. thridCircleBlinking = false;
  125. thridCircleGreen = true;
  126. break;
  127. default:
  128. break;
  129. }
  130. update();
  131. }
  132. void NavProgress::paintEvent(QPaintEvent *) {
  133. QPainter painter(this);
  134. painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
  135. if (navStyle == NavStyle_JD) {
  136. drawBg_JD(&painter);
  137. drawText_JD(&painter);
  138. }
  139. }
  140. void NavProgress::drawBg_JD(QPainter *painter) {
  141. painter->save();
  142. int width = this->width() / maxStep;
  143. int height = this->height() / 2;
  144. int radius = height / 4;
  145. int initX = 0 + radius;
  146. int initY = height / 2 + radius / 5;
  147. initX = width / 2;
  148. QPen pen;
  149. pen.setWidthF((double)radius / 4);
  150. pen.setCapStyle(Qt::RoundCap);
  151. for (int i = 0; i < maxStep - 1; i++) {
  152. if (i == 0 && firstCircleGreen) {
  153. pen.setColor(Qt::green);
  154. }else if(i == 1 && secondCircleGreen){
  155. pen.setColor(Qt::green);
  156. }else {
  157. pen.setColor(background);
  158. }
  159. painter->setPen(pen);
  160. painter->setBrush(Qt::NoBrush);
  161. painter->drawLine(QPoint(initX+ radius + radius , initY), QPoint(initX + width - (radius + radius), initY));
  162. initX += width;
  163. }
  164. initX = width / 2;
  165. painter->setPen(Qt::NoPen);
  166. for (int i = 0; i < maxStep; i++) {
  167. if (i == 0 && firstCircleGreen) {
  168. painter->setBrush(Qt::green);
  169. } else if (i == 0 && firstCircleBlinking) {
  170. painter->setBrush(blinkColor);
  171. } else if (i == 1 && secondCircleBlinking) {
  172. painter->setBrush(secondBlinkColor);
  173. } else if (i == 1 && secondCircleGreen) {
  174. painter->setBrush(Qt::green);
  175. }else if (i == 2 && thridCircleBlinking) {
  176. painter->setBrush(secondBlinkColor);
  177. }else if (i == 2 && thridCircleGreen) {
  178. painter->setBrush(Qt::green);
  179. }
  180. else {
  181. painter->setBrush(background);
  182. }
  183. painter->drawEllipse(QPoint(initX, initY), radius, radius);
  184. initX += width;
  185. }
  186. initX = width / 2;
  187. QPen outerPen;
  188. outerPen.setWidth(5);
  189. for (int i = 0; i < maxStep; i++) {
  190. if (i == 0 && firstCircleBlinking) {
  191. outerPen.setColor(blinkColor);
  192. } else if (i == 0 && firstCircleGreen) {
  193. outerPen.setColor(Qt::green); // 第一个空心圆常亮绿色
  194. } else if (i == 1 && secondCircleBlinking) {
  195. outerPen.setColor(secondBlinkColor);
  196. } else if (i == 1 && secondCircleGreen) {
  197. outerPen.setColor(Qt::green);
  198. }
  199. else if (i == 2 && thridCircleBlinking) {
  200. outerPen.setColor(secondBlinkColor);
  201. }else if (i == 2 && thridCircleGreen) {
  202. outerPen.setColor(Qt::green);
  203. }
  204. else {
  205. outerPen.setColor(background);
  206. }
  207. painter->setPen(outerPen);
  208. painter->setBrush(Qt::NoBrush);
  209. int outerRadius = radius + 5; // 外层圆半径比内层圆大 5,可按需调整
  210. painter->drawEllipse(QPoint(initX, initY), outerRadius, outerRadius);
  211. initX += width;
  212. }
  213. initX = width / 2;
  214. QFont font;
  215. font.setPixelSize(radius);
  216. painter->setFont(font);
  217. painter->setPen(foreground);
  218. painter->setBrush(Qt::NoBrush);
  219. for (int i = 0; i < maxStep; i++) {
  220. QRect textRect(initX - radius, initY - radius, radius * 2, radius * 2);
  221. painter->drawText(textRect, Qt::AlignCenter, QString::number(i + 1));
  222. initX += width;
  223. }
  224. painter->restore();
  225. }
  226. void NavProgress::drawText_JD(QPainter *painter) {
  227. int width = this->width() / maxStep;
  228. int height = this->height() / 2;
  229. int initX = 0;
  230. int initY = height * 1 /2 +10;
  231. painter->save();
  232. QFont font;
  233. font.setPixelSize(height / 4);
  234. painter->setFont(font);
  235. for (int i = 0; i < maxStep; i++) {
  236. if (i == 0 && firstCircleGreen) {
  237. painter->setPen(Qt::green); // 第一个文字为绿色
  238. } else {
  239. painter->setPen(background);
  240. }
  241. painter->setBrush(Qt::NoBrush);
  242. QRect textRect(initX, initY, width, height);
  243. painter->drawText(textRect, Qt::AlignCenter, topInfo.at(i));
  244. initX += width;
  245. }
  246. painter->restore();
  247. }