QtIndustrialWidgets 2.3.0
Modern, High-Performance Industrial Instruments & SCADA Widgets for Qt
Loading...
Searching...
No Matches
StripChart.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 Paolo Sereno <paolomsereno@gmail.com>
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7#pragma once
8
10#include <QtWidgets/QWidget>
11#include <QtGui/QColor>
12#include <QtCore/QVector>
13#include <QtCore/QDateTime>
14#include <chrono>
15#include <memory>
16
17namespace QtIndustrialWidgets {
18
19class StripChartPrivate;
20class StripChartTestAccess;
21namespace internal {
22class StripChartTestAccess;
23}
24
55{
56 Q_OBJECT
57
58 Q_PROPERTY(int capacity READ capacity WRITE setCapacity NOTIFY capacityChanged)
59 Q_PROPERTY(double yMinimum READ yMinimum WRITE setYMinimum NOTIFY yRangeChanged)
60 Q_PROPERTY(double yMaximum READ yMaximum WRITE setYMaximum NOTIFY yRangeChanged)
61 Q_PROPERTY(bool autoScaleY READ isAutoScaleY WRITE setAutoScaleY NOTIFY appearanceChanged)
62 Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible NOTIFY appearanceChanged)
63 Q_PROPERTY(bool legendVisible READ isLegendVisible WRITE setLegendVisible NOTIFY appearanceChanged)
64 Q_PROPERTY(QColor gridColor READ gridColor WRITE setGridColor NOTIFY appearanceChanged)
65 Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY appearanceChanged)
66 Q_PROPERTY(QColor bezelColor READ bezelColor WRITE setBezelColor NOTIFY appearanceChanged)
67 Q_PROPERTY(int horizontalDivisions READ horizontalDivisions WRITE setHorizontalDivisions NOTIFY appearanceChanged)
68 Q_PROPERTY(int verticalDivisions READ verticalDivisions WRITE setVerticalDivisions NOTIFY appearanceChanged)
69 Q_PROPERTY(XAxisMode xAxisMode READ xAxisMode WRITE setXAxisMode NOTIFY xAxisModeChanged)
70 Q_PROPERTY(DecimationMode decimationMode READ decimationMode WRITE setDecimationMode NOTIFY decimationModeChanged)
71 Q_PROPERTY(Interpolation interpolation READ interpolation WRITE setInterpolation NOTIFY interpolationChanged)
72 Q_PROPERTY(TimeLabelFormat timeLabelFormat READ timeLabelFormat WRITE setTimeLabelFormat NOTIFY timeLabelFormatChanged)
73 Q_PROPERTY(double timeSpanSeconds READ timeSpanSeconds WRITE setTimeSpanSeconds NOTIFY timeSpanChanged)
74
75public:
77 enum class XAxisMode {
78 SampleIndex,
79 Time
80 };
81 Q_ENUM(XAxisMode)
82
83
84 enum class DecimationMode {
85 Off,
86 Auto,
87 Always
88 };
89 Q_ENUM(DecimationMode)
90
91
92 enum class Interpolation {
93 Linear,
94 Step
95 };
96 Q_ENUM(Interpolation)
97
98
99 enum class TimeLabelFormat {
100 Relative,
101 Absolute
102 };
103 Q_ENUM(TimeLabelFormat)
104
105public:
110 explicit StripChart(QWidget *parent = nullptr);
111 ~StripChart() override;
112
114 [[nodiscard]] int capacity() const;
116 [[nodiscard]] double yMinimum() const;
118 [[nodiscard]] double yMaximum() const;
120 [[nodiscard]] bool isAutoScaleY() const;
122 [[nodiscard]] bool isGridVisible() const;
124 [[nodiscard]] bool isLegendVisible() const;
126 [[nodiscard]] QColor gridColor() const;
128 [[nodiscard]] QColor backgroundColor() const;
130 [[nodiscard]] QColor bezelColor() const;
132 [[nodiscard]] int horizontalDivisions() const;
134 [[nodiscard]] int verticalDivisions() const;
135
137 [[nodiscard]] int channelCount() const;
139 [[nodiscard]] QString channelName(int channelId) const;
141 [[nodiscard]] QColor channelColor(int channelId) const;
143 [[nodiscard]] bool isChannelVisible(int channelId) const;
145 [[nodiscard]] double channelPenWidth(int channelId) const;
147 [[nodiscard]] qsizetype channelSampleCount(int channelId) const;
149 [[nodiscard]] double channelLatestValue(int channelId) const;
150
152 [[nodiscard]] XAxisMode xAxisMode() const;
161 void setXAxisMode(XAxisMode mode);
162
164 [[nodiscard]] std::chrono::nanoseconds timeSpan() const;
166 void setTimeSpan(std::chrono::nanoseconds span);
167
169 [[nodiscard]] double timeSpanSeconds() const;
171 void setTimeSpanSeconds(double seconds);
172
174 [[nodiscard]] DecimationMode decimationMode() const;
181 void setDecimationMode(DecimationMode mode);
182
184 [[nodiscard]] Interpolation interpolation() const;
186 void setInterpolation(Interpolation interp);
187
189 [[nodiscard]] std::chrono::nanoseconds gapThreshold() const;
191 void setGapThreshold(std::chrono::nanoseconds threshold);
192
194 [[nodiscard]] QDateTime timeOrigin() const;
196 void setTimeOrigin(const QDateTime &origin);
197
199 [[nodiscard]] TimeLabelFormat timeLabelFormat() const;
201 void setTimeLabelFormat(TimeLabelFormat format);
202
204 [[nodiscard]] quint64 rejectedSampleCount(int channelId) const;
206 [[nodiscard]] bool isTimeWindowFullyCovered() const;
207
219 void addSample(int channelId, std::chrono::nanoseconds t, double value);
220
232 void addSamples(int channelId, const std::chrono::nanoseconds *t,
233 const double *values, qsizetype count);
234
247 void addUniformSamples(int channelId, std::chrono::nanoseconds t0,
248 std::chrono::nanoseconds dt,
249 const double *values, qsizetype count);
250
260 void addSynchronousSamples(std::chrono::nanoseconds t,
261 const QVector<double> &values);
262
263 [[nodiscard]] QSize sizeHint() const override;
264 [[nodiscard]] QSize minimumSizeHint() const override;
265
266public Q_SLOTS:
274 int addChannel(const QString &name, const QColor &color, double penWidth = 1.8);
276 void addDataPoint(int channelId, double value);
278 void addDataPoints(const QVector<double> &values);
280 void clear();
281
283 void setCapacity(int count);
285 void setYMinimum(double min);
287 void setYMaximum(double max);
289 void setYRange(double min, double max);
291 void setAutoScaleY(bool autoScale);
293 void setGridVisible(bool visible);
295 void setLegendVisible(bool visible);
297 void setGridColor(const QColor &color);
299 void setBackgroundColor(const QColor &color);
301 void setBezelColor(const QColor &color);
303 void setHorizontalDivisions(int divisions);
305 void setVerticalDivisions(int divisions);
307 void setChannelVisible(int channelId, bool visible);
309 void setChannelColor(int channelId, const QColor &color);
310
311Q_SIGNALS:
313 void capacityChanged(int capacity);
315 void yRangeChanged(double min, double max);
317 void dataAdded();
319 void appearanceChanged();
321 void xAxisModeChanged(XAxisMode mode);
323 void decimationModeChanged(DecimationMode mode);
325 void interpolationChanged(Interpolation interp);
327 void timeLabelFormatChanged(TimeLabelFormat format);
329 void timeSpanChanged(double seconds);
330
331protected:
332 void paintEvent(QPaintEvent *event) override;
333 void resizeEvent(QResizeEvent *event) override;
334 void changeEvent(QEvent *event) override;
335
336private:
337 void invalidateCache();
338 void renderStaticGrid(const QSize &size);
339 void updateAutoScaling();
340 void ensureAutoScale();
341 [[nodiscard]] QRectF plotArea() const;
342
343 std::unique_ptr<StripChartPrivate> d_ptr;
344 Q_DECLARE_PRIVATE(StripChart)
345 friend class StripChartTestAccess;
346 friend class internal::StripChartTestAccess;
347};
348
349} // namespace QtIndustrialWidgets
Real-time multi-channel scrolling oscilloscope and strip chart recorder.
Definition StripChart.h:55
Definition AnalysisChart.h:21
Library export macros and version definitions for QtIndustrialWidgets.
#define QTINDUSTRIALWIDGETS_EXPORT
Export/import macro for shared library symbol visibility across dynamic linking boundaries.
Definition qtindustrialwidgets_global.h:25