MCustomPlot.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "MCustomPlot.h"
  2. MCustomPlot::MCustomPlot(QWidget *parent)
  3. :QCustomPlot(parent)
  4. ,m_isShowTracer(false)
  5. ,m_xTracer(Q_NULLPTR)
  6. ,m_yTracer(Q_NULLPTR)
  7. // ,m_dataTracers(QList<MTracer *>())
  8. ,m_lineTracer(Q_NULLPTR)
  9. {
  10. }
  11. void MCustomPlot::mouseMoveEvent(QMouseEvent *event)
  12. {
  13. QCustomPlot::mouseMoveEvent(event);
  14. if(m_isShowTracer)
  15. {
  16. //当前鼠标位置(像素坐标)
  17. int x_pos = event->pos().x();
  18. int y_pos = event->pos().y();
  19. //像素坐标转成实际的x,y轴的坐标
  20. float x_val = this->xAxis->pixelToCoord(x_pos);
  21. float y_val = this->yAxis->pixelToCoord(y_pos);
  22. if(Q_NULLPTR == m_xTracer)
  23. m_xTracer = new MTracer(this, MTracer::XAxisTracer);//x轴
  24. m_xTracer->updatePosition(x_val, y_val);
  25. if(Q_NULLPTR == m_yTracer)
  26. m_yTracer = new MTracer(this, MTracer::YAxisTracer);//y轴
  27. m_yTracer->updatePosition(x_val, y_val);
  28. if(Q_NULLPTR == m_lineTracer)
  29. m_lineTracer = new MTraceLine(this,MTraceLine::Both);//直线
  30. m_lineTracer->updatePosition(x_val, y_val);
  31. int nCurveCount = this->plottableCount();
  32. /*
  33. for (int i = 0; i< nCurveCount; ++i)
  34. {
  35. MTracer *tracer = new MTracer(this, MTracer::DataTracer);
  36. tracer->setVisible(true);
  37. tracer->setPen(this->plottable(i)->pen());
  38. tracer->setBrush(Qt::NoBrush);
  39. if(this->plottable(i)->name() != "" && this->plottable(i)->name() != "")
  40. {
  41. QCPGraph * pgraph = (QCPGraph *) this->plottable(i);
  42. QCPPlottableLegendItem * item = this->legend->itemWithPlottable(pgraph);
  43. MTracer *tracer = new MTracer(this, MTracer::DataTracer);
  44. tracer->setVisible(true);
  45. tracer->setPen(this->plottable(i)->pen());
  46. tracer->setBrush(Qt::NoBrush);
  47. tracer->m_tracer->setGraph(pgraph);
  48. tracer->m_tracer->setGraphKey(x_val);
  49. tracer->m_tracer->setInterpolating(false);
  50. tracer->setLabelPen(this->plottable(i)->pen());
  51. auto iter = this->plottable(i)->interface1D()->findBegin(x_val);
  52. auto yiter = this->plottable(i)->interface1D()->dataMainValue(iter);
  53. auto xiter = this->plottable(i)->interface1D()->dataMainKey(iter);
  54. tracer->updatePosition(x_val, y_val);
  55. tracer->m_label->setText(QString("x:%1,y:%2,t:%3,k:%4,v:%5").arg(x_val).arg(y_val).arg(iter).arg(xiter).arg(yiter));
  56. if(item->selected() || pgraph->selected())
  57. {
  58. item->setSelected(true);
  59. QPen pen;
  60. pen.setWidth(10);
  61. pen.setColor(Qt::blue);
  62. pgraph->selectionDecorator()->setPen(pen);
  63. qDebug()<<QString("selected");
  64. pgraph->setSelection(QCPDataSelection(pgraph->data()->dataRange()));
  65. }
  66. tracer->deleteLater();
  67. }else if(0){
  68. //显示curve曲线
  69. //获取实部y轴的显示范围
  70. // double y_range = (this->yAxis->range().size()) / 50;
  71. // double x_range = (this->xAxis->range().size()) / 50;
  72. int pointCount = this->plottable(i)->interface1D()->dataCount(); //曲线上所有数据点个数
  73. if(pointCount)
  74. {
  75. double x,y;
  76. double xNearlest = 999;
  77. double yNearlest = 999;
  78. double xDistance;
  79. double yDistance;
  80. double xTmp = 999;
  81. double yTmp = 999;
  82. int t_index;
  83. for(int j =0; j < pointCount; j++)
  84. {
  85. double nearindex = this->plottable(i)->interface1D()->findBegin(j);
  86. double x_line = this->plottable(i)->interface1D()->dataMainKey(nearindex);
  87. double y_line = this->plottable(i)->interface1D()->dataMainValue(nearindex);
  88. xDistance = abs(x_val - x_line);
  89. yDistance = abs(y_val - y_line);
  90. if( xDistance <= xTmp && yDistance <= yTmp)
  91. {
  92. t_index = nearindex;
  93. xTmp = xDistance;
  94. yTmp = yDistance;
  95. xNearlest = x_line;
  96. yNearlest = y_line;
  97. }
  98. }
  99. MTracer *tracer = new MTracer(this, MTracer::DataTracer);
  100. tracer->setVisible(true);
  101. tracer->setPen(this->plottable(i)->pen());
  102. tracer->setBrush(Qt::NoBrush);
  103. tracer->updatePosition(xNearlest, yNearlest);
  104. tracer->deleteLater();
  105. }
  106. }
  107. }
  108. */
  109. this->replot();//曲线重绘
  110. }
  111. }