qwt_thermo.cpp
Go to the documentation of this file.
1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2  * Qwt Widget Library
3  * Copyright (C) 1997 Josef Wilgen
4  * Copyright (C) 2002 Uwe Rathmann
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the Qwt License, Version 1.0
8  *****************************************************************************/
9 
10 #include "qwt_thermo.h"
11 #include "qwt_scale_engine.h"
12 #include "qwt_scale_draw.h"
13 #include "qwt_scale_map.h"
14 #include "qwt_color_map.h"
15 #include <qpainter.h>
16 #include <qevent.h>
17 #include <qdrawutil.h>
18 #include <qstyle.h>
19 #include <qstyleoption.h>
20 #include <qmath.h>
21 
22 static inline void qwtDrawLine( QPainter *painter, int pos,
23  const QColor &color, const QRect &pipeRect, const QRect &liquidRect,
24  Qt::Orientation orientation )
25 {
26  painter->setPen( color );
27  if ( orientation == Qt::Horizontal )
28  {
29  if ( pos >= liquidRect.left() && pos < liquidRect.right() )
30  painter->drawLine( pos, pipeRect.top(), pos, pipeRect.bottom() );
31  }
32  else
33  {
34  if ( pos >= liquidRect.top() && pos < liquidRect.bottom() )
35  painter->drawLine( pipeRect.left(), pos, pipeRect.right(), pos );
36  }
37 }
38 
39 QVector<double> qwtTickList( const QwtScaleDiv &scaleDiv )
40 {
41  QVector<double> values;
42 
43  double lowerLimit = scaleDiv.interval().minValue();
44  double upperLimit = scaleDiv.interval().maxValue();
45 
46  if ( upperLimit < lowerLimit )
47  qSwap( lowerLimit, upperLimit );
48 
49  values += lowerLimit;
50 
51  for ( int tickType = QwtScaleDiv::MinorTick;
52  tickType < QwtScaleDiv::NTickTypes; tickType++ )
53  {
54  const QList<double> ticks = scaleDiv.ticks( tickType );
55 
56  for ( int i = 0; i < ticks.count(); i++ )
57  {
58  const double v = ticks[i];
59  if ( v > lowerLimit && v < upperLimit )
60  values += v;
61  }
62  }
63 
64  values += upperLimit;
65 
66  return values;
67 }
68 
70 {
71 public:
73  orientation( Qt::Vertical ),
75  spacing( 3 ),
76  borderWidth( 2 ),
77  pipeWidth( 10 ),
78  alarmLevel( 0.0 ),
79  alarmEnabled( false ),
80  autoFillPipe( true ),
82  origin( 0.0 ),
83  colorMap( NULL ),
84  value( 0.0 )
85  {
87  }
88 
90  {
91  delete colorMap;
92  }
93 
94  Qt::Orientation orientation;
96 
97  int spacing;
99  int pipeWidth;
100 
102  double alarmLevel;
106  double origin;
107 
109 
110  double value;
111 };
112 
117 QwtThermo::QwtThermo( QWidget *parent ):
118  QwtAbstractScale( parent )
119 {
120  d_data = new PrivateData;
121 
122  QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed );
123  if ( d_data->orientation == Qt::Vertical )
124  policy.transpose();
125 
126  setSizePolicy( policy );
127 
128  setAttribute( Qt::WA_WState_OwnSizePolicy, false );
129  layoutThermo( true );
130 }
131 
134 {
135  delete d_data;
136 }
137 
154 {
155  if ( d_data->rangeFlags != flags )
156  {
157  d_data->rangeFlags = flags;
158  update();
159  }
160 }
161 
167 {
168  return d_data->rangeFlags;
169 }
170 
178 {
179  if ( d_data->value != value )
180  {
181  d_data->value = value;
182  update();
183  }
184 }
185 
187 double QwtThermo::value() const
188 {
189  return d_data->value;
190 }
191 
204 {
205  setAbstractScaleDraw( scaleDraw );
206  layoutThermo( true );
207 }
208 
214 {
215  return static_cast<const QwtScaleDraw *>( abstractScaleDraw() );
216 }
217 
223 {
224  return static_cast<QwtScaleDraw *>( abstractScaleDraw() );
225 }
226 
231 void QwtThermo::paintEvent( QPaintEvent *event )
232 {
233  QPainter painter( this );
234  painter.setClipRegion( event->region() );
235 
236  QStyleOption opt;
237  opt.init(this);
238  style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this);
239 
240  const QRect tRect = pipeRect();
241 
242  if ( !tRect.contains( event->rect() ) )
243  {
245  scaleDraw()->draw( &painter, palette() );
246  }
247 
248  const int bw = d_data->borderWidth;
249 
250  const QBrush brush = palette().brush( QPalette::Base );
251  qDrawShadePanel( &painter,
252  tRect.adjusted( -bw, -bw, bw, bw ),
253  palette(), true, bw,
254  d_data->autoFillPipe ? &brush : NULL );
255 
256  drawLiquid( &painter, tRect );
257 }
258 
263 void QwtThermo::resizeEvent( QResizeEvent *event )
264 {
265  Q_UNUSED( event );
266  layoutThermo( false );
267 }
268 
273 void QwtThermo::changeEvent( QEvent *event )
274 {
275  switch( event->type() )
276  {
277  case QEvent::StyleChange:
278  case QEvent::FontChange:
279  {
280  layoutThermo( true );
281  break;
282  }
283  default:
284  break;
285  }
286 }
287 
295 void QwtThermo::layoutThermo( bool update_geometry )
296 {
297  const QRect tRect = pipeRect();
298  const int bw = d_data->borderWidth + d_data->spacing;
299  const bool inverted = ( upperBound() < lowerBound() );
300 
301  int from, to;
302 
303  if ( d_data->orientation == Qt::Horizontal )
304  {
305  from = tRect.left();
306  to = tRect.right();
307 
309  {
310  if ( inverted )
311  to++;
312  else
313  from--;
314  }
316  {
317  if ( inverted )
318  from--;
319  else
320  to++;
321  }
322 
324  {
326  scaleDraw()->move( from, tRect.top() - bw );
327  }
328  else
329  {
331  scaleDraw()->move( from, tRect.bottom() + bw );
332  }
333 
334  scaleDraw()->setLength( qMax( to - from, 0 ) );
335  }
336  else // Qt::Vertical
337  {
338  from = tRect.top();
339  to = tRect.bottom();
340 
342  {
343  if ( inverted )
344  from--;
345  else
346  to++;
347  }
349  {
350  if ( inverted )
351  to++;
352  else
353  from--;
354  }
355 
357  {
359  scaleDraw()->move( tRect.right() + bw, from );
360  }
361  else
362  {
364  scaleDraw()->move( tRect.left() - bw, from );
365  }
366 
367  scaleDraw()->setLength( qMax( to - from, 0 ) );
368  }
369 
370  if ( update_geometry )
371  {
372  updateGeometry();
373  update();
374  }
375 }
376 
381 QRect QwtThermo::pipeRect() const
382 {
383  int mbd = 0;
385  {
386  int d1, d2;
387  scaleDraw()->getBorderDistHint( font(), d1, d2 );
388  mbd = qMax( d1, d2 );
389  }
390  const int bw = d_data->borderWidth;
391  const int scaleOff = bw + mbd;
392 
393  const QRect cr = contentsRect();
394 
395  QRect pipeRect = cr;
396  if ( d_data->orientation == Qt::Horizontal )
397  {
398  pipeRect.adjust( scaleOff, 0, -scaleOff, 0 );
399 
401  pipeRect.setTop( cr.top() + cr.height() - bw - d_data->pipeWidth );
402  else
403  pipeRect.setTop( bw );
404 
405  pipeRect.setHeight( d_data->pipeWidth );
406  }
407  else // Qt::Vertical
408  {
409  pipeRect.adjust( 0, scaleOff, 0, -scaleOff );
410 
412  pipeRect.setLeft( bw );
413  else
414  pipeRect.setLeft( cr.left() + cr.width() - bw - d_data->pipeWidth );
415 
416  pipeRect.setWidth( d_data->pipeWidth );
417  }
418 
419  return pipeRect;
420 }
421 
428 void QwtThermo::setOrientation( Qt::Orientation orientation )
429 {
430  if ( orientation == d_data->orientation )
431  return;
432 
434 
435  if ( !testAttribute( Qt::WA_WState_OwnSizePolicy ) )
436  {
437  QSizePolicy sp = sizePolicy();
438  sp.transpose();
439  setSizePolicy( sp );
440 
441  setAttribute( Qt::WA_WState_OwnSizePolicy, false );
442  }
443 
444  layoutThermo( true );
445 }
446 
451 Qt::Orientation QwtThermo::orientation() const
452 {
453  return d_data->orientation;
454 }
455 
461 {
462  if ( m == d_data->originMode )
463  return;
464 
465  d_data->originMode = m;
466  update();
467 }
468 
474 {
475  return d_data->originMode;
476 }
477 
488 {
489  if ( origin == d_data->origin )
490  return;
491 
492  d_data->origin = origin;
493  update();
494 }
495 
500 double QwtThermo::origin() const
501 {
502  return d_data->origin;
503 }
504 
512 {
513  if ( d_data->scalePosition == scalePosition )
514  return;
515 
517 
518  if ( testAttribute( Qt::WA_WState_Polished ) )
519  layoutThermo( true );
520 }
521 
527 {
528  return d_data->scalePosition;
529 }
530 
533 {
534  layoutThermo( true );
535 }
536 
543  QPainter *painter, const QRect &pipeRect ) const
544 {
545  painter->save();
546  painter->setClipRect( pipeRect, Qt::IntersectClip );
547  painter->setPen( Qt::NoPen );
548 
549  const QwtScaleMap scaleMap = scaleDraw()->scaleMap();
550 
551  QRect liquidRect = fillRect( pipeRect );
552 
553  if ( d_data->colorMap != NULL )
554  {
555  const QwtInterval interval = scaleDiv().interval().normalized();
556 
557  // Because the positions of the ticks are rounded
558  // we calculate the colors for the rounded tick values
559 
560  QVector<double> values = qwtTickList( scaleDraw()->scaleDiv() );
561 
562  if ( scaleMap.isInverting() )
563  qSort( values.begin(), values.end(), qGreater<double>() );
564  else
565  qSort( values.begin(), values.end(), qLess<double>() );
566 
567  int from;
568  if ( !values.isEmpty() )
569  {
570  from = qRound( scaleMap.transform( values[0] ) );
571  qwtDrawLine( painter, from,
572  d_data->colorMap->color( interval, values[0] ),
573  pipeRect, liquidRect, d_data->orientation );
574  }
575 
576  for ( int i = 1; i < values.size(); i++ )
577  {
578  const int to = qRound( scaleMap.transform( values[i] ) );
579 
580  for ( int pos = from + 1; pos < to; pos++ )
581  {
582  const double v = scaleMap.invTransform( pos );
583 
584  qwtDrawLine( painter, pos,
585  d_data->colorMap->color( interval, v ),
586  pipeRect, liquidRect, d_data->orientation );
587  }
588 
589  qwtDrawLine( painter, to,
590  d_data->colorMap->color( interval, values[i] ),
591  pipeRect, liquidRect, d_data->orientation );
592 
593  from = to;
594  }
595  }
596  else
597  {
598  if ( !liquidRect.isEmpty() && d_data->alarmEnabled )
599  {
600  const QRect r = alarmRect( liquidRect );
601  if ( !r.isEmpty() )
602  {
603  painter->fillRect( r, palette().brush( QPalette::Highlight ) );
604  liquidRect = QRegion( liquidRect ).subtracted( r ).boundingRect();
605  }
606  }
607 
608  painter->fillRect( liquidRect, palette().brush( QPalette::ButtonText ) );
609  }
610 
611  painter->restore();
612 }
613 
626 {
627  if ( spacing <= 0 )
628  spacing = 0;
629 
630  if ( spacing != d_data->spacing )
631  {
633  layoutThermo( true );
634  }
635 }
636 
641 int QwtThermo::spacing() const
642 {
643  return d_data->spacing;
644 }
645 
651 void QwtThermo::setBorderWidth( int width )
652 {
653  if ( width <= 0 )
654  width = 0;
655 
656  if ( width != d_data->borderWidth )
657  {
658  d_data->borderWidth = width;
659  layoutThermo( true );
660  }
661 }
662 
667 int QwtThermo::borderWidth() const
668 {
669  return d_data->borderWidth;
670 }
671 
680 {
681  if ( colorMap != d_data->colorMap )
682  {
683  delete d_data->colorMap;
685  }
686 }
687 
694 {
695  return d_data->colorMap;
696 }
697 
704 {
705  return d_data->colorMap;
706 }
707 
716 void QwtThermo::setFillBrush( const QBrush& brush )
717 {
718  QPalette pal = palette();
719  pal.setBrush( QPalette::ButtonText, brush );
720  setPalette( pal );
721 }
722 
727 QBrush QwtThermo::fillBrush() const
728 {
729  return palette().brush( QPalette::ButtonText );
730 }
731 
743 void QwtThermo::setAlarmBrush( const QBrush& brush )
744 {
745  QPalette pal = palette();
746  pal.setBrush( QPalette::Highlight, brush );
747  setPalette( pal );
748 }
749 
757 QBrush QwtThermo::alarmBrush() const
758 {
759  return palette().brush( QPalette::Highlight );
760 }
761 
771 void QwtThermo::setAlarmLevel( double level )
772 {
773  d_data->alarmLevel = level;
774  d_data->alarmEnabled = 1;
775  update();
776 }
777 
785 double QwtThermo::alarmLevel() const
786 {
787  return d_data->alarmLevel;
788 }
789 
796 void QwtThermo::setPipeWidth( int width )
797 {
798  if ( width > 0 )
799  {
800  d_data->pipeWidth = width;
801  layoutThermo( true );
802  }
803 }
804 
809 int QwtThermo::pipeWidth() const
810 {
811  return d_data->pipeWidth;
812 }
813 
822 {
823  d_data->alarmEnabled = on;
824  update();
825 }
826 
833 bool QwtThermo::alarmEnabled() const
834 {
835  return d_data->alarmEnabled;
836 }
837 
842 QSize QwtThermo::sizeHint() const
843 {
844  return minimumSizeHint();
845 }
846 
853 {
854  int w = 0, h = 0;
855 
856  if ( d_data->scalePosition != NoScale )
857  {
858  const int sdExtent = qCeil( scaleDraw()->extent( font() ) );
859  const int sdLength = scaleDraw()->minLength( font() );
860 
861  w = sdLength;
862  h = d_data->pipeWidth + sdExtent + d_data->spacing;
863 
864  }
865  else // no scale
866  {
867  w = 200;
868  h = d_data->pipeWidth;
869  }
870 
871  if ( d_data->orientation == Qt::Vertical )
872  qSwap( w, h );
873 
874  w += 2 * d_data->borderWidth;
875  h += 2 * d_data->borderWidth;
876 
877  // finally add the margins
878  int left, right, top, bottom;
879  getContentsMargins( &left, &top, &right, &bottom );
880  w += left + right;
881  h += top + bottom;
882 
883  return QSize( w, h );
884 }
885 
894 QRect QwtThermo::fillRect( const QRect &pipeRect ) const
895 {
896  double origin;
897  if ( d_data->originMode == OriginMinimum )
898  {
899  origin = qMin( lowerBound(), upperBound() );
900  }
901  else if ( d_data->originMode == OriginMaximum )
902  {
903  origin = qMax( lowerBound(), upperBound() );
904  }
905  else // OriginCustom
906  {
907  origin = d_data->origin;
908  }
909 
910  const QwtScaleMap scaleMap = scaleDraw()->scaleMap();
911 
912  int from = qRound( scaleMap.transform( d_data->value ) );
913  int to = qRound( scaleMap.transform( origin ) );
914 
915  if ( to < from )
916  qSwap( from, to );
917 
918  QRect fillRect = pipeRect;
919  if ( d_data->orientation == Qt::Horizontal )
920  {
921  fillRect.setLeft( from );
922  fillRect.setRight( to );
923  }
924  else // Qt::Vertical
925  {
926  fillRect.setTop( from );
927  fillRect.setBottom( to );
928  }
929 
930  return fillRect.normalized();
931 }
932 
941 QRect QwtThermo::alarmRect( const QRect &fillRect ) const
942 {
943  QRect alarmRect( 0, 0, -1, -1); // something invalid
944 
945  if ( !d_data->alarmEnabled )
946  return alarmRect;
947 
948  const bool inverted = ( upperBound() < lowerBound() );
949 
950  bool increasing;
951  if ( d_data->originMode == OriginCustom )
952  {
953  increasing = d_data->value > d_data->origin;
954  }
955  else
956  {
957  increasing = d_data->originMode == OriginMinimum;
958  }
959 
960  const QwtScaleMap map = scaleDraw()->scaleMap();
961  const int alarmPos = qRound( map.transform( d_data->alarmLevel ) );
962  const int valuePos = qRound( map.transform( d_data->value ) );
963 
964  if ( d_data->orientation == Qt::Horizontal )
965  {
966  int v1, v2;
967  if ( inverted )
968  {
969  v1 = fillRect.left();
970 
971  v2 = alarmPos - 1;
972  v2 = qMin( v2, increasing ? fillRect.right() : valuePos );
973  }
974  else
975  {
976  v1 = alarmPos + 1;
977  v1 = qMax( v1, increasing ? fillRect.left() : valuePos );
978 
979  v2 = fillRect.right();
980 
981  }
982  alarmRect.setRect( v1, fillRect.top(), v2 - v1 + 1, fillRect.height() );
983  }
984  else
985  {
986  int v1, v2;
987  if ( inverted )
988  {
989  v1 = alarmPos + 1;
990  v1 = qMax( v1, increasing ? fillRect.top() : valuePos );
991 
992  v2 = fillRect.bottom();
993  }
994  else
995  {
996  v1 = fillRect.top();
997 
998  v2 = alarmPos - 1;
999  v2 = qMin( v2, increasing ? fillRect.bottom() : valuePos );
1000  }
1001  alarmRect.setRect( fillRect.left(), v1, fillRect.width(), v2 - v1 + 1 );
1002  }
1003 
1004  return alarmRect;
1005 }
int v
void setBorderWidth(int w)
Definition: qwt_thermo.cpp:651
The scale is right of a vertical or below of a horizontal slider.
Definition: qwt_thermo.h:79
QwtColorMap * colorMap()
Definition: qwt_thermo.cpp:693
double alarmLevel() const
void setScalePosition(ScalePosition)
Change the position of the scale.
Definition: qwt_thermo.cpp:511
QwtInterval normalized() const
Normalize the limits of the interval.
An abstract base class for widgets having a scale.
QFlags< BorderFlag > BorderFlags
Border flags.
Definition: qwt_interval.h:49
void setAlignment(Alignment)
The origin is specified using the origin() property.
Definition: qwt_thermo.h:100
void setLength(double length)
Qt::Orientation orientation() const
The scale is left of a vertical or above of a horizontal slider.
Definition: qwt_thermo.h:82
void setAbstractScaleDraw(QwtAbstractScaleDraw *)
Set a scale draw.
void setColorMap(QwtColorMap *)
Assign a color map for the fill color.
Definition: qwt_thermo.cpp:679
QwtColorMap * colorMap
Definition: qwt_thermo.cpp:108
std::vector< double > values
A class representing an interval.
Definition: qwt_interval.h:26
int spacing() const
virtual void scaleChange()
Notify a scale change.
Definition: qwt_thermo.cpp:532
virtual void paintEvent(QPaintEvent *)
Definition: qwt_thermo.cpp:231
OriginMode originMode() const
Max value is not included in the interval.
Definition: qwt_interval.h:42
double minValue() const
Definition: qwt_interval.h:193
The origin is the minimum of the scale.
Definition: qwt_thermo.h:94
The scale is above.
void setRangeFlags(QwtInterval::BorderFlags)
Exclude/Include min/max values.
Definition: qwt_thermo.cpp:153
int pipeWidth() const
void setSpacing(int)
Change the spacing between pipe and scale.
Definition: qwt_thermo.cpp:625
QwtThermo(QWidget *parent=NULL)
Definition: qwt_thermo.cpp:117
virtual void resizeEvent(QResizeEvent *)
Definition: qwt_thermo.cpp:263
const QwtScaleMap & scaleMap() const
QVector< double > qwtTickList(const QwtScaleDiv &scaleDiv)
Definition: qwt_thermo.cpp:39
static void qwtDrawLine(QPainter *painter, int pos, const QColor &color, const QRect &pipeRect, const QRect &liquidRect, Qt::Orientation orientation)
Definition: qwt_thermo.cpp:22
A class representing a scale division.
Definition: qwt_scale_div.h:36
Qt::Orientation orientation
Definition: qwt_thermo.cpp:94
const QwtScaleMap & scaleMap() const
void getBorderDistHint(const QFont &, int &start, int &end) const
Determine the minimum border distance.
double maxValue() const
Definition: qwt_interval.h:199
int minLength(const QFont &) const
void setOriginMode(OriginMode)
Change how the origin is determined.
Definition: qwt_thermo.cpp:460
void update(const std::string &key, const XmlRpc::XmlRpcValue &v)
QRect pipeRect() const
Definition: qwt_thermo.cpp:381
QBrush alarmBrush() const
Definition: qwt_thermo.cpp:757
The origin is the maximum of the scale.
Definition: qwt_thermo.h:97
double value() const
PrivateData * d_data
Definition: qwt_thermo.h:174
The scale is left.
const QwtScaleDiv & scaleDiv() const
size_t to
QwtColorMap is used to map values into colors.
Definition: qwt_color_map.h:33
Min value is not included in the interval.
Definition: qwt_interval.h:39
const QwtAbstractScaleDraw * abstractScaleDraw() const
void setPipeWidth(int w)
Definition: qwt_thermo.cpp:796
QColor color(const QwtInterval &, double value) const
A scale map.
Definition: qwt_scale_map.h:30
double invTransform(double p) const
void layoutThermo(bool)
Definition: qwt_thermo.cpp:295
QBrush fillBrush() const
Definition: qwt_thermo.cpp:727
Number of valid tick types.
Definition: qwt_scale_div.h:55
virtual QSize sizeHint() const
Definition: qwt_thermo.cpp:842
The Thermometer Widget.
Definition: qwt_thermo.h:46
QwtThermo::ScalePosition scalePosition
Definition: qwt_thermo.cpp:95
void setFillBrush(const QBrush &b)
Change the brush of the liquid.
Definition: qwt_thermo.cpp:716
virtual QSize minimumSizeHint() const
Definition: qwt_thermo.cpp:852
QwtInterval::BorderFlags rangeFlags
Definition: qwt_thermo.cpp:101
TFSIMD_FORCE_INLINE const tfScalar & w() const
void setAlarmLevel(double v)
Definition: qwt_thermo.cpp:771
QwtThermo::OriginMode originMode
Definition: qwt_thermo.cpp:105
virtual ~QwtThermo()
Destructor.
Definition: qwt_thermo.cpp:133
int borderWidth() const
virtual void draw(QPainter *, const QPalette &) const
Draw the scale.
double lowerBound() const
QwtInterval::BorderFlags rangeFlags() const
Definition: qwt_thermo.cpp:166
bool alarmEnabled() const
const QwtScaleDraw * scaleDraw() const
Definition: qwt_thermo.cpp:213
void setOrientation(Qt::Orientation)
Set the orientation.
Definition: qwt_thermo.cpp:428
The scale is right.
void setScaleDraw(QwtScaleDraw *)
Set a scale draw.
Definition: qwt_thermo.cpp:203
QwtInterval interval() const
A class for drawing scales.
ScalePosition scalePosition() const
void setAlarmEnabled(bool tf)
Enable or disable the alarm threshold.
Definition: qwt_thermo.cpp:821
void setOrigin(double)
Specifies the custom origin.
Definition: qwt_thermo.cpp:487
bool isInverting() const
double transform(double s) const
double origin() const
int i
The slider has no scale.
Definition: qwt_thermo.h:76
double upperBound() const
QRect fillRect(const QRect &) const
Calculate the filled rectangle of the pipe.
Definition: qwt_thermo.cpp:894
void setAlarmBrush(const QBrush &b)
Specify the liquid brush above the alarm threshold.
Definition: qwt_thermo.cpp:743
size_t from
QList< double > ticks(int tickType) const
virtual void setValue(double val)
Definition: qwt_thermo.cpp:177
virtual void drawLiquid(QPainter *, const QRect &) const
Definition: qwt_thermo.cpp:542
virtual void changeEvent(QEvent *)
Definition: qwt_thermo.cpp:273
Min/Max values are inside the interval.
Definition: qwt_interval.h:36
The scale is below.
void move(double x, double y)
QRect alarmRect(const QRect &) const
Calculate the alarm rectangle of the pipe.
Definition: qwt_thermo.cpp:941


plotjuggler
Author(s): Davide Faconti
autogenerated on Sat Jul 6 2019 03:44:18