- 1. Projektstruktur
- 2. Widget.h
- 3. Widget.cpp
Analysieren wir die Option zum Erstellen von Diagrammen, wenn Sie eine große Anzahl dynamisch erstellter Diagramme hinzufügen müssen. Eine ähnliche Lektion gab es bereits im Artikel zur dynamischen Erstellung von Widgets, nur wurden dort die Schaltflächen [QPushButton] hinzugefügt (https://evileg.com/en/post/77/) . Die gleiche Arbeitsweise ist hier verwendet. Auf dem Heap wird Speicher zugewiesen, das Diagramm-Widget wird konfiguriert und das Widget wird zu einer QScrollArea oder einem QLayout hinzugefügt, um das Diagramm selbst im Anwendungsfenster anzuzeigen.
Die Anwendung wird wie folgt aussehen:
Dieses Beispiel fügt einem horizontalen Layout ( QHBoxLayout ) 5 Diagramme hinzu. Auch im Beispiel wird ein Tooltip hinzugefügt, der einige Informationen enthält. Zum Beispiel die Nummer des Diagramms und die Anzahl der Messwerte.
Projektstruktur
- Graphs.pro - Projektprofil;
- widget.h - Header-Datei des Anwendungsfensters;
- widget.cpp - Quellcodedatei des Anwendungsfensters;
- widget.ui - Anwendungsfensterformular;
- main.cpp - Datei mit Hauptfunktion.
main.cpp wird standardmäßig erstellt und ändert sich nicht im Projekt. In der widget.ui -Datei müssen Sie nur ein QHBoxLayout -Layout erstellen. Dies kann über den Qt-Grafikdesigner erfolgen.
Im Projektprofil müssen Sie das Modul charts einbinden (es muss vorinstalliert sein; QtCharts ist seit Qt5.7 als vorkompilierte Bibliotheken verfügbar).
QT += charts
An der Header-Datei widget.h werden keine weiteren Änderungen vorgenommen. Der gesamte Code wird in der Datei widget.cpp. enthalten sein
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); // Установка базового числа для отсчёта рандома в 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; }
Сделайте, пожалуйста пример, где обновление уже существующего графика
Здравствуйте! Можно ли расширить данный пример создания графиков печатью их на принтере. Другими словами, как распечатать эти 5 графиков на принтере, чтобы изображение на листе бумаги было таким же, как на главном окне программы?