homepage.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "homepage.h"
  2. #include <QDate>
  3. #include <QJsonArray>
  4. #include <QJsonDocument>
  5. #include <QJsonObject>
  6. #include <QList>
  7. #include <QPainter>
  8. #include <QPair>
  9. #include <QtCharts/QBarCategoryAxis>
  10. #include <QtCharts/QBarSeries>
  11. #include <QtCharts/QBarSet>
  12. #include <QtCharts/QChart>
  13. #include <QtCharts/QChartView>
  14. #include <QtCharts/QValueAxis>
  15. #include "backendapimanager.h"
  16. #include "ui_homepage.h"
  17. Homepage::Homepage(QWidget *parent) : QWidget(parent), ui(new Ui::homepage) {
  18. ui->setupUi(this);
  19. QJsonArray dailyCount;
  20. dailyCount = backendAPIManager::getDailyBlastedCount(15);
  21. QDate today = QDate::currentDate();
  22. QString dateTodayStr = QDate::currentDate().toString("yyyy-MM-dd");
  23. QList<QPair<QDate, int>> data;
  24. // 根据today,倒退15天,检查dailyCount中date是否和日期匹配,如果匹配设置数据,不匹配则设置0
  25. for (int i = 0; i < 15; ++i) {
  26. QDate date = today.addDays(-i);
  27. QString dateStr = date.toString("yyyy-MM-dd");
  28. bool found = false;
  29. if (dailyCount[0].toObject().value("blast_at").toString() == dateStr) {
  30. if (dateStr == dateTodayStr) {
  31. m_todayCount = dailyCount[0].toObject().value("count").toInt();
  32. }
  33. data.append(qMakePair(date, dailyCount[0].toObject().value("count").toInt()));
  34. dailyCount.removeFirst(); // 移除已处理的元素
  35. } else {
  36. data.append(qMakePair(date, 0));
  37. }
  38. }
  39. draw(data);
  40. }
  41. Homepage::~Homepage() { delete ui; }
  42. void Homepage::draw(QList<QPair<QDate, int>> data) {
  43. // 2. Bar Set and Series
  44. QBarSet *set = new QBarSet("");
  45. QStringList categories;
  46. int totalCount = 0;
  47. for (const auto &entry : data) {
  48. *set << entry.second;
  49. categories << entry.first.toString("MM-dd");
  50. totalCount += entry.second;
  51. }
  52. if (totalCount == 0) {
  53. set->setLabel("无爆破数据");
  54. } else {
  55. set->setLabel("总计: " + QString::number(totalCount));
  56. }
  57. QBarSeries *series = new QBarSeries();
  58. series->append(set);
  59. series->setLabelsVisible(true);
  60. // 3. Create Chart
  61. QChart *chart = new QChart();
  62. chart->addSeries(series);
  63. chart->setTitle("近15日已上传爆破数据统计");
  64. // 4. X-axis (Category with Dates)
  65. QBarCategoryAxis *axisX = new QBarCategoryAxis();
  66. axisX->append(categories);
  67. axisX->setTitleText("日期");
  68. chart->addAxis(axisX, Qt::AlignBottom);
  69. series->attachAxis(axisX);
  70. // 5. Y-axis (Count)
  71. QValueAxis *axisY = new QValueAxis();
  72. axisY->setTitleText("数量");
  73. axisY->setLabelFormat("%d");
  74. chart->addAxis(axisY, Qt::AlignLeft);
  75. series->attachAxis(axisY);
  76. // 6. Show Chart
  77. QChartView *chartView = new QChartView(chart);
  78. chartView->setRenderHint(QPainter::Antialiasing);
  79. // Add the chart view to the widget's layout
  80. QVBoxLayout *layout = new QVBoxLayout(ui->chartWidget);
  81. layout->addWidget(chartView);
  82. ui->chartWidget->setLayout(layout);
  83. ui->todayBlastCount->display(m_todayCount);
  84. }