CustomLineGraph.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "CustomLineGraph.h"
  2. #include <QDebug>
  3. #include <QBrush>
  4. #include <random>
  5. #include <algorithm>
  6. CustomLineGraph::CustomLineGraph(QWidget* parent):QWidget(parent), linePen(Qt::blue), rectPen(Qt::red), axisPen(Qt::black)
  7. {
  8. linePen.setWidth(3);
  9. linePen.setJoinStyle(Qt::PenJoinStyle::RoundJoin);
  10. LineGraphSeries lgs;
  11. //Populate data with DummyData
  12. //Draw Points
  13. std::random_device rd; //Will be used to obtain a seed for the random number engine
  14. std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
  15. std::uniform_int_distribution<> dis(-3, 3);
  16. for (int randomSeries = 0; randomSeries < 2; randomSeries++) {
  17. for (int i = 0; i < 21; i++) {
  18. QPoint point(i * 50 + 500,i * 1 + dis(gen) - 10000);
  19. lgs.data.push_back(point);
  20. }
  21. auto pairX = std::minmax_element(std::begin(lgs.data), std::end(lgs.data), [](const QPoint& a,const QPoint& b) -> bool {return a.x() < b.x(); });
  22. lgs.minX = pairX.first->x();
  23. lgs.maxX = pairX.second->x();
  24. auto pairY = std::minmax_element(std::begin(lgs.data), std::end(lgs.data), [](const QPoint& a, const QPoint& b) -> bool {return a.y() < b.y(); });
  25. lgs.minY = pairY.first->y();
  26. lgs.maxY = pairY.second->y();
  27. lgs.rangeX = std::abs(lgs.maxX - lgs.minX);
  28. lgs.rangeY = std::abs(lgs.maxY - lgs.minY);
  29. seriesVec.push_back(lgs);
  30. }
  31. }
  32. CustomLineGraph::~CustomLineGraph()
  33. {
  34. }
  35. void CustomLineGraph::paintEvent(QPaintEvent* event)
  36. {
  37. QPainter painter(this);
  38. painter.setRenderHint(QPainter::RenderHint::HighQualityAntialiasing);
  39. //Calculate LineRect
  40. QRect lineRect(rect());
  41. lineRect.setBottom(lineRect.bottom() - 20);
  42. lineRect.setLeft(lineRect.left() + 40);
  43. lineRect.setTop(lineRect.top() + 20);
  44. lineRect.setRight(lineRect.right() - 10);
  45. lineRect.setWidth(lineRect.width() - (lineRect.width() % 10) + 1);
  46. lineRect.setHeight(lineRect.height() - (lineRect.height() % 10) + 1);
  47. //draw Title
  48. painter.setPen(axisPen);
  49. painter.setFont(QFont("Arial", 12));
  50. QRect titleRect(QPoint(lineRect.left(), rect().top()), QPoint(lineRect.right(), lineRect.top()));
  51. painter.drawText(titleRect, Qt::AlignCenter, "title");
  52. //draw X-Axis
  53. QRect xAxisRect(QPoint(lineRect.left(), lineRect.bottom()), QPoint(lineRect.right(), rect().bottom()));
  54. QPainterPath xAxisPath;
  55. xAxisPath.moveTo(xAxisRect.left(), xAxisRect.top());
  56. xAxisPath.lineTo(xAxisRect.right(), xAxisRect.top());
  57. int xGap = xAxisRect.width() / 10;
  58. for (int i = 0; i < 11; i++) {
  59. xAxisPath.moveTo(xAxisRect.left() + i * xGap, xAxisRect.top() + 5);
  60. xAxisPath.lineTo(xAxisRect.left() + i * xGap, xAxisRect.top());
  61. }
  62. painter.drawPath(xAxisPath);
  63. //draw Y-Axis
  64. QRect yAxisRect(QPoint(rect().left(), lineRect.top()), QPoint(lineRect.left(), lineRect.bottom()));
  65. QPainterPath yAxisPath;
  66. yAxisPath.moveTo(yAxisRect.right(), yAxisRect.bottom() + 5);
  67. yAxisPath.lineTo(yAxisRect.right(), yAxisRect.top());
  68. int yGap = yAxisRect.height() / 10;
  69. for (int i = 0; i < 11; i++) {
  70. yAxisPath.moveTo(yAxisRect.right() - 5, yAxisRect.top() + i * yGap);
  71. yAxisPath.lineTo(yAxisRect.right(), yAxisRect.top() + i * yGap);
  72. }
  73. painter.drawPath(yAxisPath);
  74. painter.setPen(linePen);
  75. for (LineGraphSeries series : seriesVec) {
  76. double stregth_factorX = lineRect.width() / series.rangeX;
  77. double stregth_factorY = lineRect.height() / series.rangeY;
  78. QPointF translation(lineRect.left(), lineRect.top());
  79. QPainterPath painterPath;
  80. painterPath.moveTo(transformPoint(series.data[0], series, stregth_factorX, stregth_factorY));
  81. for(int i = 1; i < seriesVec[0].data.size(); i++) {
  82. painterPath.lineTo(transformPoint(series.data[i], series, stregth_factorX, stregth_factorY));
  83. }
  84. painterPath.translate(translation);
  85. painter.drawPath(painterPath);
  86. int radius;
  87. for (int i = 0; i < seriesVec[0].data.size(); i++) {
  88. painter.drawEllipse(transformPoint(series.data[i], series, stregth_factorX, stregth_factorY) + translation, 3, 3);
  89. }
  90. }
  91. }
  92. QPoint CustomLineGraph::transformPoint(QPoint& point, LineGraphSeries& lgs, double stregth_factorX, double stregth_factorY)
  93. {
  94. return QPoint((point.x() - lgs.minX)* stregth_factorX , (lgs.maxY - point.y()) * stregth_factorY);
  95. }