Evgenii Legotckoi
Evgenii Legotckoi05 серпня 2017 р. 05: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;
}

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

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

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

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

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

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

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

Коментарі

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

Qt - Тест 001. Сигналы и слоты

  • Результат:52бали,
  • Рейтинг балів-4
NN

Qt - Тест 001. Сигналы и слоты

  • Результат:78бали,
  • Рейтинг балів2
1
  • 12333
  • 18 липня 2024 р. 11:34

Qt - Тест 001. Сигналы и слоты

  • Результат:63бали,
  • Рейтинг балів-1
Останні коментарі
G
GoattRock03 вересня 2024 р. 19:50
Як скопіювати файли в Linux Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
ВР
Влад Русоков02 серпня 2024 р. 07:47
Як скопіювати файли в Linux Screenshot_20240802-065123.png
d
dblas505 липня 2024 р. 17:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr09 лютого 2024 р. 00:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 07:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 21:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
Fynjy22 липня 2024 р. 10:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCT25 червня 2024 р. 07:00
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCT05 травня 2024 р. 11:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 20:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Слідкуйте за нами в соціальних мережах