navprogress.cpp 8.0 KB

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