qwt_thermo.h 4.93 KB
Newer Older
pixhawk's avatar
pixhawk committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_THERMO_H
#define QWT_THERMO_H

#include <qwidget.h>
#include <qcolor.h>
#include <qfont.h>
#include <qrect.h>
#include "qwt_global.h"
#include "qwt_abstract_scale.h"

class QwtScaleDraw;

/*!
  \brief The Thermometer Widget

  QwtThermo is a widget which displays a value in an interval. It supports:
  - a horizontal or vertical layout;
  - a range;
  - a scale;
  - an alarm level.

  \image html sysinfo.png

  By default, the scale and range run over the same interval of values.
  QwtAbstractScale::setScale() changes the interval of the scale and allows
  easy conversion between physical units.

  The example shows how to make the scale indicate in degrees Fahrenheit and
  to set the value in degrees Kelvin:
\code
#include <qapplication.h>
#include <qwt_thermo.h>

double Kelvin2Fahrenheit(double kelvin)
{
    // see http://en.wikipedia.org/wiki/Kelvin
    return 1.8*kelvin - 459.67;
}

int main(int argc, char **argv)
{
    const double minKelvin = 0.0;
    const double maxKelvin = 500.0;

    QApplication a(argc, argv);
    QwtThermo t;
    t.setRange(minKelvin, maxKelvin);
    t.setScale(Kelvin2Fahrenheit(minKelvin), Kelvin2Fahrenheit(maxKelvin));
    // set the value in Kelvin but the scale displays in Fahrenheit
    // 273.15 Kelvin = 0 Celsius = 32 Fahrenheit
    t.setValue(273.15);
    a.setMainWidget(&t);
    t.show();
    return a.exec();
}
\endcode

67
  \todo Improve the support for a logarithmic range and/or scale.
pixhawk's avatar
pixhawk committed
68 69 70 71 72 73 74 75 76 77 78 79
*/
class QWT_EXPORT QwtThermo: public QWidget, public QwtAbstractScale
{
    Q_OBJECT

    Q_ENUMS( ScalePos )

    Q_PROPERTY( QBrush alarmBrush READ alarmBrush WRITE setAlarmBrush )
    Q_PROPERTY( QColor alarmColor READ alarmColor WRITE setAlarmColor )
    Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled )
    Q_PROPERTY( double alarmLevel READ alarmLevel WRITE setAlarmLevel )
    Q_PROPERTY( ScalePos scalePosition READ scalePosition
80
                WRITE setScalePosition )
pixhawk's avatar
pixhawk committed
81 82 83 84 85 86 87 88 89 90 91 92 93 94
    Q_PROPERTY( int borderWidth READ borderWidth WRITE setBorderWidth )
    Q_PROPERTY( QBrush fillBrush READ fillBrush WRITE setFillBrush )
    Q_PROPERTY( QColor fillColor READ fillColor WRITE setFillColor )
    Q_PROPERTY( double maxValue READ maxValue WRITE setMaxValue )
    Q_PROPERTY( double minValue READ minValue WRITE setMinValue )
    Q_PROPERTY( int pipeWidth READ pipeWidth WRITE setPipeWidth )
    Q_PROPERTY( double value READ value WRITE setValue )

public:
    /*
      Scale position. QwtThermo tries to enforce valid combinations of its
      orientation and scale position:
      - Qt::Horizonal combines with NoScale, TopScale and BottomScale
      - Qt::Vertical combines with NoScale, LeftScale and RightScale
95

pixhawk's avatar
pixhawk committed
96 97
      \sa setOrientation, setScalePosition
    */
98 99 100 101 102
    enum ScalePos {
        NoScale,
        LeftScale,
        RightScale,
        TopScale,
pixhawk's avatar
pixhawk committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
        BottomScale
    };

    explicit QwtThermo(QWidget *parent = NULL);
#if QT_VERSION < 0x040000
    explicit QwtThermo(QWidget *parent, const char *name);
#endif
    virtual ~QwtThermo();

    void setOrientation(Qt::Orientation o, ScalePos s);

    void setScalePosition(ScalePos s);
    ScalePos scalePosition() const;

    void setBorderWidth(int w);
    int borderWidth() const;

    void setFillBrush(const QBrush &b);
    const QBrush &fillBrush() const;

    void setFillColor(const QColor &c);
    const QColor &fillColor() const;
125

pixhawk's avatar
pixhawk committed
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
    void setAlarmBrush(const QBrush &b);
    const QBrush &alarmBrush() const;

    void setAlarmColor(const QColor &c);
    const QColor &alarmColor() const;

    void setAlarmLevel(double v);
    double alarmLevel() const;

    void setAlarmEnabled(bool tf);
    bool alarmEnabled() const;

    void setPipeWidth(int w);
    int pipeWidth() const;

    void setMaxValue(double v);
    double maxValue() const;

    void setMinValue(double v);
    double minValue() const;

    double value() const;

    void setRange(double vmin, double vmax, bool lg = false);
    void setMargin(int m);

    virtual QSize sizeHint() const;
    virtual QSize minimumSizeHint() const;

    void setScaleDraw(QwtScaleDraw *);
    const QwtScaleDraw *scaleDraw() const;

public slots:
    void setValue(double val);
160

pixhawk's avatar
pixhawk committed
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
protected:
    void draw(QPainter *p, const QRect& update_rect);
    void drawThermo(QPainter *p);
    void layoutThermo( bool update = true );
    virtual void scaleChange();
    virtual void fontChange(const QFont &oldFont);

    virtual void paintEvent(QPaintEvent *e);
    virtual void resizeEvent(QResizeEvent *e);

    QwtScaleDraw *scaleDraw();

private:
    void initThermo();
    int transform(double v) const;
176

pixhawk's avatar
pixhawk committed
177 178 179 180 181
    class PrivateData;
    PrivateData *d_data;
};

#endif