Privacy policyContactsAbout siteOpinionsGitHubDonate
© EVILEG 2015-2018
Recommend hosting
TIMEWEB

Qt/C ++ - Tutorial 071. Dynamic creation of graphs with QtCharts.

Qt5, QtCharts

We will analyze the creation of graphs when it is necessary to add a large number of graphs, which are created dynamically. A similar lesson was already in the article on dynamically creating widgets, only there were added QPushButton buttons. Here the same variant of work is applied. Memory is allocated in the heap, the widget is adjusted with a graph, and the widget adds to QScrollArea or QLayout to display the graph itself in the application window.

The application will look like this:

In this example, 5 graphs will be added to the horizontal Layout ( QHBoxLayout ). Also in the example, a tooltip that contains some information will be added. For example, the number of the graph and the number of counts.

Project structure

  • Graphs.pro - project profile;
  • widget.h - the header file for the application window;
  • widget.cpp - the source file for the application window;
  • widget.ui - the form of the application window;
  • main.cpp - file with the main function.

main.cpp is created by default and does not change in the project. In the widget.ui file, you only need to create the QHBoxLayout placement. You can do this through the graphic designer Qt.

In the project profile, you need to connect the charts module (it must be pre-installed, in the form of precompiled libraries QtCharts is available from version Qt5.7).

QT       += charts

The widget.h header file does not make any additional changes. All the code will be contained in the file widget.cpp .

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QLogValueAxis>
#include <QLineSeries>
#include <QValueAxis>
#include <QChart>
#include <QChartView>

#include <math.h>

static int randomBetween(int low, int high, int seed)
{
    qsrand(seed); // Set the base number for counting a random host in qrand
    return (qrand() % ((high + 1) - low) + low);
}

using namespace QtCharts;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // Initializing number for setting the base of the randomization in qrand
    int seed = 0;

    for (int i = 0; i < 5; ++i)
    {
        // Create a graph view
        QChartView *chartView = new QChartView(this);
        // Adding it to the horizontal Layout
        ui->horizontalLayout->addWidget(chartView);

        // Create a random sinusoid
        seed = randomBetween(0, 100, seed);
        QLineSeries *series = new QLineSeries();
        int k = 0;
        while (k <= 100)
        {
            *series << QPointF(sin((seed+ k)*0.1), k);
            ++k;
        }

        // Create a graph and add a sinusoid to it
        QChart *chart = new QChart();
        chart->addSeries(series);
        chart->legend()->hide();
        chart->setTitle("Graphic");

        // Add a tooltip for the chart
        chart->setToolTip(QString("Graph №%1\n"
                                  "Number of counts %2").arg(i + 1).arg(k));

        // Adjusting the Axes of the Graph
        QValueAxis *axisX = new QValueAxis();
        axisX->setTitleText("x, м");
        axisX->setLabelFormat("%i");
        axisX->setTickCount(1);
        chart->addAxis(axisX, Qt::AlignBottom);
        series->attachAxis(axisX);

        QValueAxis *axisY = new QValueAxis();
        axisY->setTitleText("t, мс");
        axisY->setLabelFormat("%g");
        axisY->setTickCount(5);
        chart->addAxis(axisY, Qt::AlignLeft);
        series->attachAxis(axisY);

        // We set the graph in the view
        chartView->setChart(chart);
    }
}

Widget::~Widget()
{
    delete ui;
}

Link for downloading the project

Virtual hosting with 10 percent discount
Virtual hosting with 10 percent discount
EVILEG offers reliable hosting with a 10% discount for virtual hosting and 5% for VPS
k

Сделайте, пожалуйста пример, где обновление уже существующего графика

Comments

Only authorized users can post comments.
Please, Log in or Sign up
МБ
April 21, 2019, 9:40 a.m.
Моисей Бушуев

Qt - Test 001. Signals and slots

  • Result:0points,
  • Rating points-10
AA
April 17, 2019, 7:40 p.m.
Anton Ablin

Qt - Test 001. Signals and slots

  • Result:73points,
  • Rating points1
E
April 17, 2019, 6:16 p.m.
Evgeny

Qt - Test 001. Signals and slots

  • Result:100points,
  • Rating points10
Last comments
April 21, 2019, 4:22 p.m.
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
April 21, 2019, 3:48 p.m.
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
April 18, 2019, 3:37 p.m.
Unreal_man

А как иконку в хедер задать?
u
April 18, 2019, 2:15 a.m.
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
April 11, 2019, 12:49 p.m.
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Now discuss on the forum
April 24, 2019, 11:22 a.m.
Ruslan Polupan

Согласен. но ситуация не поменялась. Такое чуство что данные не записываются в модель.
April 24, 2019, 6:20 a.m.
Ruslan Polupan

я так понимаю надо инфорация об устройствах.Я бы пробовал так rust@suse:~> lsblk -PNAME="sda" MAJ:MIN="8:0" RM="0" SIZE="111,8G" RO="0" TYPE="disk" MOUNTPOINT=""NAME="sda1" MAJ:MIN="8...
April 21, 2019, 4:16 p.m.
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
April 19, 2019, 9:55 a.m.
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
Join us in social networks

For registered users on the site there is a minimum amount of advertising