QtIndustrialWidgets 2.3.0
Modern, High-Performance Industrial Instruments & SCADA Widgets for Qt
Loading...
Searching...
No Matches
AnalysisChart.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
11#include <QtCore/QDateTime>
12#include <QtCore/QList>
13#include <QtCore/QStringList>
14#include <QtGui/QColor>
15#include <QtWidgets/QWidget>
16
17#include <chrono>
18#include <memory>
19#include <optional>
20
22
23class AnalysisChartPrivate;
24namespace internal {
25class AnalysisChartTestAccess;
26}
27
76{
77 Q_OBJECT
78 Q_PROPERTY(double yMinimum READ yMinimum NOTIFY viewChanged)
79 Q_PROPERTY(double yMaximum READ yMaximum NOTIFY viewChanged)
80 Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible NOTIFY appearanceChanged)
81 Q_PROPERTY(bool legendVisible READ isLegendVisible WRITE setLegendVisible NOTIFY appearanceChanged)
82 Q_PROPERTY(bool readoutVisible READ isReadoutVisible WRITE setReadoutVisible NOTIFY appearanceChanged)
83 Q_PROPERTY(QColor gridColor READ gridColor WRITE setGridColor NOTIFY appearanceChanged)
84 Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY appearanceChanged)
85 Q_PROPERTY(QColor bezelColor READ bezelColor WRITE setBezelColor NOTIFY appearanceChanged)
86 Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor NOTIFY appearanceChanged)
87 Q_PROPERTY(QColor cursorColor READ cursorColor WRITE setCursorColor NOTIFY appearanceChanged)
88 Q_PROPERTY(DecimationMode decimationMode READ decimationMode WRITE setDecimationMode NOTIFY appearanceChanged)
89 Q_PROPERTY(TimeLabelFormat timeLabelFormat READ timeLabelFormat WRITE setTimeLabelFormat NOTIFY appearanceChanged)
90 Q_PROPERTY(QDateTime timeOrigin READ timeOrigin WRITE setTimeOrigin NOTIFY appearanceChanged)
91
92public:
94 enum class Cursor { A, B };
95 Q_ENUM(Cursor)
96
97
98 enum class DecimationMode {
99 Off,
100 Auto,
101 Always
102 };
103 Q_ENUM(DecimationMode)
104
105
106 enum class TimeLabelFormat {
107 Relative,
108 Absolute
109 };
110 Q_ENUM(TimeLabelFormat)
111
112
113 struct Sample {
114 std::chrono::nanoseconds t{0};
115 double value{0.0};
116 };
117
118 explicit AnalysisChart(QWidget *parent = nullptr);
119 ~AnalysisChart() override;
120
121 // --- Channels: ids are stable, never reused, and unaffected by removing other channels ---
122
124 int addChannel(const QString &name, const QColor &color, double penWidth = 1.8);
126 bool removeChannel(int channelId);
128 void removeAllChannels();
130 [[nodiscard]] QList<int> channelIds() const;
131 [[nodiscard]] int channelCount() const;
133 [[nodiscard]] QString channelName(int channelId) const;
134 void setChannelName(int channelId, const QString &name);
136 [[nodiscard]] QColor channelColor(int channelId) const;
137 void setChannelColor(int channelId, const QColor &color);
138 [[nodiscard]] bool isChannelVisible(int channelId) const;
139 void setChannelVisible(int channelId, bool visible);
140 [[nodiscard]] double channelPenWidth(int channelId) const;
141 void setChannelPenWidth(int channelId, double width);
142
143 // --- Data: copied, so the caller's buffers may be freed after the call ---
144
152 bool setChannelData(int channelId, const std::chrono::nanoseconds *t, const double *values, qsizetype count);
153 [[nodiscard]] qsizetype channelSampleCount(int channelId) const;
155 [[nodiscard]] bool hasData() const;
157 [[nodiscard]] std::chrono::nanoseconds dataStart() const;
159 [[nodiscard]] std::chrono::nanoseconds dataEnd() const;
164 [[nodiscard]] std::optional<Sample> nearestSample(int channelId, std::chrono::nanoseconds t) const;
165
167 [[nodiscard]] std::chrono::nanoseconds gapThreshold() const;
168 void setGapThreshold(std::chrono::nanoseconds threshold);
169
170 // --- View ---
171
172 [[nodiscard]] std::chrono::nanoseconds xStart() const;
173 [[nodiscard]] std::chrono::nanoseconds xEnd() const;
179 void setXRange(std::chrono::nanoseconds start, std::chrono::nanoseconds end);
180 [[nodiscard]] double yMinimum() const;
181 [[nodiscard]] double yMaximum() const;
183 void setYRange(double minimum, double maximum);
184
185 // --- Cursors ---
186
188 [[nodiscard]] bool isCursorVisible(Cursor cursor) const;
189 void setCursorVisible(Cursor cursor, bool visible);
191 [[nodiscard]] std::chrono::nanoseconds cursorPosition(Cursor cursor) const;
192 void setCursorPosition(Cursor cursor, std::chrono::nanoseconds t);
194 [[nodiscard]] std::optional<Sample> cursorReadout(int channelId, Cursor cursor) const;
196 [[nodiscard]] std::chrono::nanoseconds cursorDeltaTime() const;
198 [[nodiscard]] std::optional<double> cursorDeltaValue(int channelId) const;
199
200 // --- Appearance ---
201
202 [[nodiscard]] bool isGridVisible() const;
203 [[nodiscard]] bool isLegendVisible() const;
204 [[nodiscard]] bool isReadoutVisible() const;
205 [[nodiscard]] QColor gridColor() const;
206 [[nodiscard]] QColor backgroundColor() const;
207 [[nodiscard]] QColor bezelColor() const;
208 [[nodiscard]] QColor textColor() const;
209 [[nodiscard]] QColor cursorColor() const;
210 [[nodiscard]] DecimationMode decimationMode() const;
211 [[nodiscard]] TimeLabelFormat timeLabelFormat() const;
212 [[nodiscard]] QDateTime timeOrigin() const;
213
214 [[nodiscard]] QSize sizeHint() const override;
215 [[nodiscard]] QSize minimumSizeHint() const override;
216
217public Q_SLOTS:
219 void clear();
221 void resetView();
222 void setGridVisible(bool visible);
223 void setLegendVisible(bool visible);
225 void setReadoutVisible(bool visible);
226 void setGridColor(const QColor &color);
227 void setBackgroundColor(const QColor &color);
228 void setBezelColor(const QColor &color);
229 void setTextColor(const QColor &color);
230 void setCursorColor(const QColor &color);
231 void setDecimationMode(DecimationMode mode);
232 void setTimeLabelFormat(TimeLabelFormat format);
233 void setTimeOrigin(const QDateTime &origin);
234
235Q_SIGNALS:
237 void viewChanged();
239 void channelsChanged();
241 void cursorsChanged();
243 void appearanceChanged();
244
245protected:
246 void paintEvent(QPaintEvent *event) override;
247 void resizeEvent(QResizeEvent *event) override;
248 void changeEvent(QEvent *event) override;
249 void mousePressEvent(QMouseEvent *event) override;
250 void mouseMoveEvent(QMouseEvent *event) override;
251 void mouseReleaseEvent(QMouseEvent *event) override;
252 void mouseDoubleClickEvent(QMouseEvent *event) override;
253 void wheelEvent(QWheelEvent *event) override;
254 void keyPressEvent(QKeyEvent *event) override;
255
256private:
257 [[nodiscard]] QRectF plotArea() const;
258 [[nodiscard]] double readoutBandHeight() const;
259 [[nodiscard]] double readoutBandWidth() const;
260 [[nodiscard]] QList<QStringList> readoutRows() const;
261 [[nodiscard]] qint64 readoutResolution() const;
262 void clampViewToData();
263
264 std::unique_ptr<AnalysisChartPrivate> d_ptr;
265 Q_DECLARE_PRIVATE(AnalysisChart)
266 friend class internal::AnalysisChartTestAccess;
267};
268
269} // namespace QtIndustrialWidgets
Offline review of recorded multi-channel data (#25).
Definition AnalysisChart.h:76
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