Evgenii Legotckoi
05 серпня 2017 р. 15:54

Qt/C ++ - Підручник 071. Динамічне створення графіків за допомогою QtCharts.

Розберемо варіант створення графіків, коли необхідно додавати велику кількість графіків, що створюються динамічно. Подібний урок вже був у статті з динамічного створення віджетів, тільки там додавалися кнопки QPushButton . Тут застосовується той самий варіант роботи. Виділяється пам'ять у купі, проводиться настроювання віджету з графіком, і віджет додає QScrollArea або QLayout, щоб відобразити сам графік у вікні програми.

Додаток буде виглядати так:

У цьому прикладі буде додаватися 5 графіків у горизонтальний Layout ( QHBoxLayout ). Також у прикладі буде додано спливаючу підказку, яка містить деяку інформацію. Наприклад, номер графіка та кількість відліків.


Структура проекту

  • Graphs.pro - профайл проекту;
  • widget.h - заголовний файл вікна програми;
  • widget.cpp - файл вихідних кодів вікна програми;
  • widget.ui - форма вікна програми;
  • main.cpp - файл із main функцією.

main.cpp створюється за замовчуванням і не змінюється у проекті. У файлі widget.ui необхідно створити розміщення QHBoxLayout . Зробити це можна за допомогою графічного дизайнера Qt.

У профайлі проекту необхідно підключити модуль charts (він має бути попередньо встановлений у вигляді передкомпільованих бібліотек QtCharts доступний з версії Qt5.7).

QT       += charts

У заголовному файлі widget.h немає жодних додаткових змін. Весь код міститься у файлі widget.cpp.

віджет.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); // Установка базового числа для отсчёта рандома в qrand
    return (qrand() % ((high + 1) - low) + low);
}

using namespace QtCharts;

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

    // Инициализирующее число для установки базы рандома в qrand
    int seed = 0;

    for (int i = 0; i < 5; ++i)
    {
        // Создаём представление графика
        QChartView *chartView = new QChartView(this);
        // Добавляем его в горизонтальный Layout
        ui->horizontalLayout->addWidget(chartView);

        // Создаём случайную синусоиду
        seed = randomBetween(0, 100, seed);
        QLineSeries *series = new QLineSeries();
        int k = 0;
        while (k <= 100)
        {
            *series << QPointF(sin((seed+ k)*0.1), k);
            ++k;
        }

        // Создаём график и добавляем в него синусоиду
        QChart *chart = new QChart();
        chart->addSeries(series);
        chart->legend()->hide();
        chart->setTitle("Graphic");

        // Добавим всплывающую подсказку для графика
        chart->setToolTip(QString("График №%1\n"
                                  "Количество отсчётов %2").arg(i + 1).arg(k));

        // Настройка осей графика
        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);

        // Устанавливаем график в представление
        chartView->setChart(chart);
    }
}

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

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

Вам це подобається? Поділіться в соціальних мережах!

k
  • 08 червня 2018 р. 13:33

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

VV
  • 07 листопада 2019 р. 14:03

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

Коментарі

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