C
Cobra911511 июля 2020 г. 13:17

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

c++, Qt

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

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

#ifndef CHART_H
#define CHART_H

#include <QChart>
#include <QTimer>
#include <QAbstractAxis>
#include <QLineSeries>
#include <QValueAxis>
#include <QAreaSeries>
#include <QDebug>

QT_CHARTS_BEGIN_NAMESPACE
class QLineSeries;
class QValueAxis;
QT_CHARTS_END_NAMESPACE

QT_CHARTS_USE_NAMESPACE

class Chart: public QChart
{
    Q_OBJECT
public:
    Chart(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0);
    void setLabelsOn(bool isOn);
    void setPenStyle(QColor color, int width);
    void setLegendOn(bool isOn);
    void setAxisGridLineOn(bool isOn);
    virtual ~Chart();

public slots:
    void handleTimeout();

private:
    QTimer m_timer;
    QLineSeries *m_series;
    QLineSeries *series1;
    QValueAxis *m_axisX;
    QValueAxis *m_axisY;
    qreal m_x;
    qreal m_y;
    QList<double> testList;
    QAreaSeries *areaSeries;
};

#endif /* CHART_H */
#include "chart.h"

Chart::Chart(QGraphicsItem *parent, Qt::WindowFlags wFlags):
    QChart(QChart::ChartTypeCartesian, parent, wFlags),
    m_series(nullptr),
    m_x(5),
    m_y(0)
{
    m_axisX = new QValueAxis(this);
    m_axisY = new QValueAxis(this);
    m_series = new QLineSeries(this);
    m_series->append(m_x, m_y);
    series1 = new QLineSeries(this);
    series1->append(1, 1);
    testList << 93.8436 << 777.797 << 2507.78 << 5999.44 << 6806.54 << 7481.16
             << 8008.5 << 1500.5 << 8328.4 << 1998.4 << 9092.04 << 1885.60 << 8093.8 << 8161.83 << 8216.99
             << 8280.46 << 8394.55 << 8469.84
             << 8500.65 << 2500.88 << 8558.16 << 8660.9 << 8638.87
             << 8726.47 << 8715.25 << 8804.48 << 8793.86
             << 8839.42 << 8875.75 << 8938.24 << 8977.09
             << 9020.27 << 9046.7 << 9092.04 << 9121.58
             << 9155.36 << 9199.46 << 10 << 8 << 3 << 1 << 0;
    areaSeries = new QAreaSeries(m_series, series1);
    areaSeries->setBrush(QBrush(QColor(Qt::red)));
    addSeries(areaSeries);
    setAxisX(m_axisX, m_series);
    setAxisY(m_axisY, m_series);
    setAxisX(m_axisX, series1);
    setAxisY(m_axisY, series1);
    m_axisX->setTickCount(5);
    m_axisX->setRange(0, 5);
    m_axisY->setRange(0, 9199.4);
    connect(&m_timer, &QTimer::timeout, this, &Chart::handleTimeout);
    m_timer.setInterval(1000);
    m_timer.start();
}

void Chart::setAxisGridLineOn(bool isOn)
{
    m_axisX->setGridLineVisible(isOn);
    m_axisY->setGridLineVisible(isOn);
}

void Chart::setLegendOn(bool isOn)
{
    if (isOn) {
        legend()->show();
    } else {
        legend()->hide();
    }
}

void Chart::setPenStyle(QColor color, int width)
{
    QPen pen(color);
    pen.setWidth(width);
    m_series->setPen(pen);
}

void Chart::setLabelsOn(bool isOn)
{
    m_axisX->setLabelsVisible(isOn);
    m_axisY->setLabelsVisible(isOn);
}

void Chart::handleTimeout()
{
    qreal x = plotArea().width() / m_axisX->tickCount();
    qreal y = (m_axisX->max() - m_axisX->min()) / m_axisX->tickCount();
    m_x += y;

    if (!testList.isEmpty()) {
        m_y = testList.first();
        testList.takeFirst();
    } else {
        m_timer.stop();
    }

    qDebug() << "m_x: " << m_x << " " << "m_y: " << m_y;
    m_series->append(m_x, m_y);
    series1->append(m_y, 0);
    scroll(x, 0);
}

Chart::~Chart()
{

}

main.cpp:

#include "chart.h"
#include <QChartView>
#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QGraphicsLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget window;
    window.setWindowTitle("Test Chart Widget");
    Chart *chart = new Chart;
    chart->setLabelsOn(true);
    chart->setPenStyle(Qt::blue, 1);
    chart->setLegendOn(false);
    chart->setBackgroundRoundness(1);
    chart->setAxisGridLineOn(true);
    //chart->setContentsMargins(-60, -25, -25, -40);
    chart->layout()->setContentsMargins(0, 0, 0, 0);
    chart->setAnimationOptions(QChart::AllAnimations);
    QChartView chartView(chart);
    chartView.setStyleSheet("border: 1px solid blue;");
    chartView.setRenderHint(QPainter::Antialiasing);
    QHBoxLayout *layout = new QHBoxLayout();
    layout->setContentsMargins(QMargins());
    layout->addWidget(&chartView);
    window.setLayout(layout);
    window.setMinimumSize(810, 400);
    window.show();
    return a.exec();
}

Скриншот:

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
5

День добрый.

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

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

C

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

Я хочу сделать что-то такое чтобы мониторить сеть когда загружается файл: 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

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

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

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

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

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

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

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
VD

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
Ds

C++ - Тест 003. Условия и циклы

  • Результат:64баллов,
  • Очки рейтинга-1
o

C++ - Тест 001. Первая программа и типы данных

  • Результат:86баллов,
  • Очки рейтинга6
Последние комментарии
D:

QML - Урок 016. База данных SQLite и работа с ней в QML Qt

Добрый день, пытаюсь разобраться и подргнать пример под себя. Есть бд с огромным количеством полей. В приложении на виджетах при использовании QTableView все работает и путем простого sql запрос…

Django - Урок 039. Добавление личных сообщений и чатов на сайте - Часть 2 (Счётчик диалогов и чатов с непрочитанными сообщениями)

Добавляйте поле файла в модель сообщения. И в форме сообщения указывайте, что поле с файлом.
s

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

все, я со всем разобрался!) Извините!)
s

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

Доброго времени суток!) Я случайно набрел на вашу статью, и она помогла мне решить некоторые мои трудности, я прошел за вами по шагам, в попытках адаптировать это под себя, и возник вопрос. У ва…
Сейчас обсуждают на форуме
  • BlinCT
  • 7 августа 2020 г. 9:05

Динамическое заполнение StackLayout в qml

Всем привет. Пытаюсь решить такую задачку, есть TabBar и его кнопки. StackLayout{ currentIndex: tabBar.currentIndex A {id: tabA} B {id: tabB} C {id: tabC} D {id: ta…

Наследование QWidget

Добрый день В addWidget нужно ещё указывать номер строки и колонки, куда добаляется виджет. И в вашем случае лучше Диалоговое окно не наследовать сразу от QDialog и W, а наследовать …
М

QML: изменение стиля при наведении и при нажатии на кнопку

enabled = false перестанет быть активной и не будет ни на что реагировать) Хм.. по-моему пробовал такое. Проверю ещё раз после работы. Ура, спасибо большо…
U

Динамическое наполнение StackView QML

Во затупил))) Спасибо за все))) StackView.push("ModuleTip1.qml") ну или в сложной иерархии StackView.push("qrc:/folder/ModuleTip1.qml") и всего делов... Не пойму, почему сра…

QEventLoop тормозит при удалении экземпляра

Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB