C
1 июля 2020 г. 23:17

Счечик производительности сети

c++, Qt

Здравствуйте!

Я хочу создать график для производительности сети. Но график рисуется не так как должен. Мой пример кода:

  1. #ifndef CHART_H
  2. #define CHART_H
  3.  
  4. #include <QChart>
  5. #include <QTimer>
  6. #include <QAbstractAxis>
  7. #include <QLineSeries>
  8. #include <QValueAxis>
  9. #include <QAreaSeries>
  10. #include <QDebug>
  11.  
  12. QT_CHARTS_BEGIN_NAMESPACE
  13. class QLineSeries;
  14. class QValueAxis;
  15. QT_CHARTS_END_NAMESPACE
  16.  
  17. QT_CHARTS_USE_NAMESPACE
  18.  
  19. class Chart: public QChart
  20. {
  21. Q_OBJECT
  22. public:
  23. Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
  24. void setLabelsOn(bool isOn);
  25. void setPenStyle(QColor color, int width);
  26. void setLegendOn(bool isOn);
  27. void setAxisGridLineOn(bool isOn);
  28. virtual ~Chart();
  29.  
  30. public slots:
  31. void handleTimeout();
  32.  
  33. private:
  34. QTimer m_timer;
  35. QLineSeries *m_series;
  36. QLineSeries *series1;
  37. QValueAxis *m_axisX;
  38. QValueAxis *m_axisY;
  39. qreal m_x;
  40. qreal m_y;
  41. QList<double> testList;
  42. QAreaSeries *areaSeries;
  43. };
  44.  
  45. #endif /* CHART_H */
  1. #include "chart.h"
  2.  
  3. Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
  4. QChart(QChart::ChartTypeCartesian, parent, wFlags),
  5. m_series(nullptr),
  6. m_x(5),
  7. m_y(0)
  8. {
  9. m_axisX = new QValueAxis(this);
  10. m_axisY = new QValueAxis(this);
  11. m_series = new QLineSeries(this);
  12. m_series->append(m_x, m_y);
  13. series1 = new QLineSeries(this);
  14. series1->append(1, 1);
  15. testList << 93.8436 << 777.797 << 2507.78 << 5999.44 << 6806.54 << 7481.16
  16. << 8008.5 << 1500.5 << 8328.4 << 1998.4 << 9092.04 << 1885.60 << 8093.8 << 8161.83 << 8216.99
  17. << 8280.46 << 8394.55 << 8469.84
  18. << 8500.65 << 2500.88 << 8558.16 << 8660.9 << 8638.87
  19. << 8726.47 << 8715.25 << 8804.48 << 8793.86
  20. << 8839.42 << 8875.75 << 8938.24 << 8977.09
  21. << 9020.27 << 9046.7 << 9092.04 << 9121.58
  22. << 9155.36 << 9199.46 << 10 << 8 << 3 << 1 << 0;
  23. areaSeries = new QAreaSeries(m_series, series1);
  24. areaSeries->setBrush(QBrush(QColor(Qt::red)));
  25. addSeries(areaSeries);
  26. setAxisX(m_axisX, m_series);
  27. setAxisY(m_axisY, m_series);
  28. setAxisX(m_axisX, series1);
  29. setAxisY(m_axisY, series1);
  30. m_axisX->setTickCount(5);
  31. m_axisX->setRange(0, 5);
  32. m_axisY->setRange(0, 9199.4);
  33. connect(&m_timer, &QTimer::timeout, this, &Chart::handleTimeout);
  34. m_timer.setInterval(1000);
  35. m_timer.start();
  36. }
  37.  
  38. void Chart::setAxisGridLineOn(bool isOn)
  39. {
  40. m_axisX->setGridLineVisible(isOn);
  41. m_axisY->setGridLineVisible(isOn);
  42. }
  43.  
  44. void Chart::setLegendOn(bool isOn)
  45. {
  46. if (isOn) {
  47. legend()->show();
  48. } else {
  49. legend()->hide();
  50. }
  51. }
  52.  
  53. void Chart::setPenStyle(QColor color, int width)
  54. {
  55. QPen pen(color);
  56. pen.setWidth(width);
  57. m_series->setPen(pen);
  58. }
  59.  
  60. void Chart::setLabelsOn(bool isOn)
  61. {
  62. m_axisX->setLabelsVisible(isOn);
  63. m_axisY->setLabelsVisible(isOn);
  64. }
  65.  
  66. void Chart::handleTimeout()
  67. {
  68. qreal x = plotArea().width() / m_axisX->tickCount();
  69. qreal y = (m_axisX->max() - m_axisX->min()) / m_axisX->tickCount();
  70. m_x += y;
  71.  
  72. if (!testList.isEmpty()) {
  73. m_y = testList.first();
  74. testList.takeFirst();
  75. } else {
  76. m_timer.stop();
  77. }
  78.  
  79. qDebug() << "m_x: " << m_x << " " << "m_y: " << m_y;
  80. m_series->append(m_x, m_y);
  81. series1->append(m_y, 0);
  82. scroll(x, 0);
  83. }
  84.  
  85. Chart::~Chart()
  86. {
  87.  
  88. }

main.cpp:

  1. #include "chart.h"
  2. #include <QChartView>
  3. #include <QApplication>
  4. #include <QWidget>
  5. #include <QHBoxLayout>
  6. #include <QGraphicsLayout>
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10. QApplication a(argc, argv);
  11. QWidget window;
  12. window.setWindowTitle("Test Chart Widget");
  13. Chart *chart = new Chart;
  14. chart->setLabelsOn(true);
  15. chart->setPenStyle(Qt::blue, 1);
  16. chart->setLegendOn(false);
  17. chart->setBackgroundRoundness(1);
  18. chart->setAxisGridLineOn(true);
  19. //chart->setContentsMargins(-60, -25, -25, -40);
  20. chart->layout()->setContentsMargins(0, 0, 0, 0);
  21. chart->setAnimationOptions(QChart::AllAnimations);
  22. QChartView chartView(chart);
  23. chartView.setStyleSheet("border: 1px solid blue;");
  24. chartView.setRenderHint(QPainter::Antialiasing);
  25. QHBoxLayout *layout = new QHBoxLayout();
  26. layout->setContentsMargins(QMargins());
  27. layout->addWidget(&chartView);
  28. window.setLayout(layout);
  29. window.setMinimumSize(810, 400);
  30. window.show();
  31. return a.exec();
  32. }

Скриншот:

Как можно исправить эту проблему? Спасибо за помощь.

2

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 2 июля 2020 г. 11:46

День добрый.

Но график рисуется не так как должен

Собственнно говоря, а как он должен рисоваться вы даже и не описали. Никто не знает, чего именно вы хотите от этого графика.

    C
    • 2 июля 2020 г. 12:42

    Здравствуйте!

    Я хочу сделать что-то такое чтобы мониторить сеть когда загружается файл: https://i.stack.imgur.com/DpKpF.png . Сначала делал по примеру Dynamicspline для того чтобы график двигался: https://doc.qt.io/qt-5/qtcharts-dynamicspline-example.html . Получился такой график: https://ddgobkiprc33d.cloudfront.net/0ad813d3-4182-4c56-b67f-5df9bc2e3b99.png . Чтобы добавить фон, использовал QAreaSeries и график выходит такой: https://evileg.com/media/users/Cobra91151/photos/photo.jpg . Я думаю что расчеты у меня неверны. Спасибо за помощь.

      C
      • 2 июля 2020 г. 13:02

      Также проверил через debug режим и увидел эти сообщения: "Can not find series on the chart."
      "Can not find series on the chart.". Думаю что это связано с QLineSeries *series1;

      Но, пока не могу определить где именно проблема.

        Evgenii Legotckoi
        • 2 июля 2020 г. 13:06

        Хорошо. После работы сегодня гляну ваш код внимательно.

          C
          • 9 июля 2020 г. 22:30
          • Ответ был помечен как решение.

          Здравствуйте!

          Я решил проблему используя QtNetworkMonitor пример с GitHub . Вопрос закрыт.

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            • Последние комментарии
            • IscanderChe
              12 апреля 2025 г. 17:12
              Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
            • AK
              1 апреля 2025 г. 11:41
              Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
            • Evgenii Legotckoi
              9 марта 2025 г. 21:02
              К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
            • VP
              9 марта 2025 г. 16:14
              Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
            • ИМ
              22 ноября 2024 г. 21:51
              Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…