Evgenii Legotckoi
Evgenii LegotckoiAug. 5, 2017, 5:54 a.m.

Qt/C ++ - Tutorial 071. Dynamic creation of graphs with 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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

k
  • June 8, 2018, 3:33 a.m.

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

VV
  • Nov. 7, 2019, 3:03 a.m.

Здравствуйте! Можно ли расширить данный пример создания графиков печатью их на принтере. Другими словами, как распечатать эти 5 графиков на принтере, чтобы изображение на листе бумаги было таким же, как на главном окне программы?

Comments

Only authorized users can post comments.
Please, Log in or Sign up
AD

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:50points,
  • Rating points-4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
m

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:20points,
  • Rating points-10
Last comments
ИМ
Игорь МаксимовNov. 22, 2024, 10:51 p.m.
Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiNov. 1, 2024, 12:37 a.m.
Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEOct. 19, 2024, 6:19 p.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовOct. 5, 2024, 5:51 p.m.
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5July 5, 2024, 9:02 p.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Now discuss on the forum
Evgenii Legotckoi
Evgenii LegotckoiJune 25, 2024, 1:11 a.m.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Nov. 15, 2024, 5:04 p.m.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectJune 4, 2022, 1:49 p.m.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimOct. 25, 2024, 7:10 p.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Follow us in social networks