MTracer.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "MTracer.h"
  2. MTracer::MTracer(QCustomPlot *_plot, TracerType _type, QObject *parent)
  3. : QObject(parent),
  4. m_plot(_plot),
  5. m_type(_type)
  6. {
  7. m_visible = true;
  8. m_tracer = Q_NULLPTR;// 跟踪的点
  9. m_label = Q_NULLPTR;// 显示的数值
  10. m_arrow = Q_NULLPTR;// 箭头
  11. if (m_plot)
  12. {
  13. QColor clrDefault(Qt::red);
  14. QBrush brushDefault(Qt::NoBrush);
  15. QPen penDefault(clrDefault);
  16. // penDefault.setBrush(brushDefault);
  17. penDefault.setWidthF(0.5);
  18. m_tracer = new QCPItemTracer(m_plot);
  19. m_tracer->setStyle(QCPItemTracer::tsCircle);
  20. m_tracer->setPen(penDefault);
  21. m_tracer->setBrush(brushDefault);
  22. m_label = new QCPItemText(m_plot);
  23. m_label->setLayer("overlay");
  24. m_label->setClipToAxisRect(false);
  25. m_label->setPadding(QMargins(5, 5, 5, 5));
  26. m_label->setBrush(brushDefault);
  27. m_label->setPen(penDefault);
  28. m_label->position->setParentAnchor(m_tracer->position);
  29. // m_label->setFont(QFont("宋体", 8));
  30. m_label->setFont(QFont("Arial", 8));
  31. m_label->setColor(clrDefault);
  32. m_label->setText("");
  33. m_arrow = new QCPItemLine(m_plot);
  34. QPen arrowPen(clrDefault, 1);
  35. m_arrow->setPen(penDefault);
  36. m_arrow->setLayer("overlay");
  37. m_arrow->setClipToAxisRect(false);
  38. m_arrow->setHead(QCPLineEnding::esSpikeArrow);//设置头部为箭头形状
  39. switch (m_type)
  40. {
  41. case XAxisTracer:
  42. {
  43. m_tracer->position->setTypeX(QCPItemPosition::ptPlotCoords);
  44. m_tracer->position->setTypeY(QCPItemPosition::ptAxisRectRatio);
  45. m_tracer->setSize(7);
  46. m_label->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);
  47. m_arrow->end->setParentAnchor(m_tracer->position);
  48. m_arrow->start->setParentAnchor(m_arrow->end);
  49. m_arrow->start->setCoords(0, 20);//偏移量
  50. break;
  51. }
  52. case YAxisTracer:
  53. {
  54. m_tracer->position->setTypeX(QCPItemPosition::ptAxisRectRatio);
  55. m_tracer->position->setTypeY(QCPItemPosition::ptPlotCoords);
  56. m_tracer->setSize(7);
  57. m_label->setPositionAlignment(Qt::AlignRight | Qt::AlignHCenter);
  58. m_arrow->end->setParentAnchor(m_tracer->position);
  59. m_arrow->start->setParentAnchor(m_label->position);
  60. m_arrow->start->setCoords(-20, 0);//偏移量
  61. break;
  62. }
  63. case DataTracer:
  64. {
  65. m_tracer->position->setTypeX(QCPItemPosition::ptPlotCoords);
  66. m_tracer->position->setTypeY(QCPItemPosition::ptPlotCoords);
  67. m_tracer->setSize(5);
  68. m_label->setPositionAlignment(Qt::AlignLeft | Qt::AlignVCenter);
  69. m_arrow->end->setParentAnchor(m_tracer->position);
  70. m_arrow->start->setParentAnchor(m_arrow->end);
  71. m_arrow->start->setCoords(20, 0);
  72. break;
  73. }
  74. default:
  75. break;
  76. }
  77. setVisible(false);
  78. }
  79. }
  80. MTracer::~MTracer()
  81. {
  82. if(m_plot)
  83. {
  84. if (m_tracer)
  85. m_plot->removeItem(m_tracer);
  86. if (m_label)
  87. m_plot->removeItem(m_label);
  88. if (m_arrow)
  89. m_plot->removeItem(m_arrow);
  90. }
  91. }
  92. void MTracer::setPen(const QPen &pen)
  93. {
  94. if(m_tracer)
  95. m_tracer->setPen(pen);
  96. if(m_arrow)
  97. m_arrow->setPen(pen);
  98. }
  99. void MTracer::setBrush(const QBrush &brush)
  100. {
  101. if(m_tracer)
  102. m_tracer->setBrush(brush);
  103. }
  104. void MTracer::setLabelPen(const QPen &pen)
  105. {
  106. if(m_label)
  107. {
  108. m_label->setPen(pen);
  109. m_label->setBrush(Qt::NoBrush);
  110. m_label->setColor(pen.color());
  111. }
  112. }
  113. void MTracer::setText(const QString &text)
  114. {
  115. if(m_label)
  116. m_label->setText(text);
  117. }
  118. void MTracer::setVisible(bool vis)
  119. {
  120. m_visible = vis;
  121. if(m_tracer)
  122. m_tracer->setVisible(m_visible);
  123. if(m_label)
  124. m_label->setVisible(m_visible);
  125. if(m_arrow)
  126. m_arrow->setVisible(m_visible);
  127. }
  128. void MTracer::updatePosition(double xValue, double yValue)
  129. {
  130. if (!m_visible)
  131. {
  132. setVisible(true);
  133. m_visible = true;
  134. }
  135. if (yValue > m_plot->yAxis->range().upper)
  136. yValue = m_plot->yAxis->range().upper;
  137. switch (m_type)
  138. {
  139. case XAxisTracer:
  140. {
  141. m_tracer->position->setCoords(xValue, 1);
  142. m_label->position->setCoords(0, 15);
  143. m_arrow->start->setCoords(0, 15);
  144. m_arrow->end->setCoords(0, 0);
  145. setText(QString::number(xValue));
  146. break;
  147. }
  148. case YAxisTracer:
  149. {
  150. m_tracer->position->setCoords(0, yValue);
  151. m_label->position->setCoords(-20, 0);
  152. // m_arrow->start->setCoords(20, 0);
  153. // m_arrow->end->setCoords(0, 0);
  154. setText(QString::number(yValue));
  155. break;
  156. }
  157. case DataTracer:
  158. {
  159. m_tracer->position->setCoords(xValue, yValue);
  160. m_label->position->setCoords(20, 0);
  161. setText(QString("x:%1,y:%2").arg(xValue).arg(yValue));
  162. break;
  163. }
  164. default:
  165. break;
  166. }
  167. }
  168. MTraceLine::MTraceLine(QCustomPlot *_plot, LineType _type, QObject *parent)
  169. : QObject(parent),
  170. m_type(_type),
  171. m_plot(_plot)
  172. {
  173. m_lineV = Q_NULLPTR;
  174. m_lineH = Q_NULLPTR;
  175. initLine();
  176. }
  177. MTraceLine::~MTraceLine()
  178. {
  179. if(m_plot)
  180. {
  181. if (m_lineV)
  182. m_plot->removeItem(m_lineV);
  183. if (m_lineH)
  184. m_plot->removeItem(m_lineH);
  185. }
  186. }
  187. void MTraceLine::initLine()
  188. {
  189. if(m_plot)
  190. {
  191. QPen linesPen(Qt::red, 1, Qt::DashLine);
  192. if(VerticalLine == m_type || Both == m_type)
  193. {
  194. m_lineV = new QCPItemStraightLine(m_plot);//垂直线
  195. m_lineV->setLayer("overlay");
  196. m_lineV->setPen(linesPen);
  197. m_lineV->setClipToAxisRect(true);
  198. m_lineV->point1->setCoords(0, 0);
  199. m_lineV->point2->setCoords(0, 0);
  200. }
  201. if(HorizonLine == m_type || Both == m_type)
  202. {
  203. m_lineH = new QCPItemStraightLine(m_plot);//水平线
  204. m_lineH->setLayer("overlay");
  205. m_lineH->setPen(linesPen);
  206. m_lineH->setClipToAxisRect(true);
  207. m_lineH->point1->setCoords(0, 0);
  208. m_lineH->point2->setCoords(0, 0);
  209. }
  210. }
  211. }
  212. void MTraceLine::updatePosition(double xValue, double yValue)
  213. {
  214. if(VerticalLine == m_type || Both == m_type)
  215. {
  216. if(m_lineV)
  217. {
  218. m_lineV->point1->setCoords(xValue, m_plot->yAxis->range().lower);
  219. m_lineV->point2->setCoords(xValue, m_plot->yAxis->range().upper);
  220. }
  221. }
  222. if(HorizonLine == m_type || Both == m_type)
  223. {
  224. if(m_lineH)
  225. {
  226. m_lineH->point1->setCoords(m_plot->xAxis->range().lower, yValue);
  227. m_lineH->point2->setCoords(m_plot->xAxis->range().upper, yValue);
  228. }
  229. }
  230. }