Evgenii Legotckoi
5 августа 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).

  1. QT += charts

В заголовочном файле widget.h не производится никаких дополнительных изменений. Весь код будет содержаться в файле widget.cpp.

widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3.  
  4. #include <QWidget>
  5.  
  6. namespace Ui {
  7. class Widget;
  8. }
  9.  
  10. class Widget : public QWidget
  11. {
  12. Q_OBJECT
  13.  
  14. public:
  15. explicit Widget(QWidget *parent = 0);
  16. ~Widget();
  17.  
  18. private:
  19. Ui::Widget *ui;
  20. };
  21.  
  22. #endif // WIDGET_H

widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3.  
  4. #include <QLogValueAxis>
  5. #include <QLineSeries>
  6. #include <QValueAxis>
  7. #include <QChart>
  8. #include <QChartView>
  9.  
  10. #include <math.h>
  11.  
  12. static int randomBetween(int low, int high, int seed)
  13. {
  14. qsrand(seed); // Установка базового числа для отсчёта рандома в qrand
  15. return (qrand() % ((high + 1) - low) + low);
  16. }
  17.  
  18. using namespace QtCharts;
  19.  
  20. Widget::Widget(QWidget *parent) :
  21. QWidget(parent),
  22. ui(new Ui::Widget)
  23. {
  24. ui->setupUi(this);
  25.  
  26. // Инициализирующее число для установки базы рандома в qrand
  27. int seed = 0;
  28.  
  29. for (int i = 0; i < 5; ++i)
  30. {
  31. // Создаём представление графика
  32. QChartView *chartView = new QChartView(this);
  33. // Добавляем его в горизонтальный Layout
  34. ui->horizontalLayout->addWidget(chartView);
  35.  
  36. // Создаём случайную синусоиду
  37. seed = randomBetween(0, 100, seed);
  38. QLineSeries *series = new QLineSeries();
  39. int k = 0;
  40. while (k <= 100)
  41. {
  42. *series << QPointF(sin((seed+ k)*0.1), k);
  43. ++k;
  44. }
  45.  
  46. // Создаём график и добавляем в него синусоиду
  47. QChart *chart = new QChart();
  48. chart->addSeries(series);
  49. chart->legend()->hide();
  50. chart->setTitle("Graphic");
  51.  
  52. // Добавим всплывающую подсказку для графика
  53. chart->setToolTip(QString("График №%1\n"
  54. "Количество отсчётов %2").arg(i + 1).arg(k));
  55.  
  56. // Настройка осей графика
  57. QValueAxis *axisX = new QValueAxis();
  58. axisX->setTitleText("x, м");
  59. axisX->setLabelFormat("%i");
  60. axisX->setTickCount(1);
  61. chart->addAxis(axisX, Qt::AlignBottom);
  62. series->attachAxis(axisX);
  63.  
  64. QValueAxis *axisY = new QValueAxis();
  65. axisY->setTitleText("t, мс");
  66. axisY->setLabelFormat("%g");
  67. axisY->setTickCount(5);
  68. chart->addAxis(axisY, Qt::AlignLeft);
  69. series->attachAxis(axisY);
  70.  
  71. // Устанавливаем график в представление
  72. chartView->setChart(chart);
  73. }
  74. }
  75.  
  76. Widget::~Widget()
  77. {
  78. delete ui;
  79. }

Ссылка для скачивания проекта

Вам это нравится? Поделитесь в социальных сетях!

k
  • 8 июня 2018 г. 13:33

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

VV
  • 7 ноября 2019 г. 14:03

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

Комментарии

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