qwt_plot.h 8.24 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
/* -*- 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_PLOT_H
#define QWT_PLOT_H

#include <qframe.h>
#include "qwt_global.h"
#include "qwt_array.h"
#include "qwt_text.h"
#include "qwt_plot_dict.h"
#include "qwt_scale_map.h"
#include "qwt_plot_printfilter.h"

class QwtPlotLayout;
class QwtLegend;
class QwtScaleWidget;
class QwtScaleEngine;
class QwtScaleDiv;
class QwtScaleDraw;
class QwtTextLabel;
class QwtPlotCanvas;
class QwtPlotPrintFilter;

/*!
  \brief A 2-D plotting widget

  QwtPlot is a widget for plotting two-dimensional graphs.
35 36 37
  An unlimited number of plot items can be displayed on
  its canvas. Plot items might be curves (QwtPlotCurve), markers
  (QwtPlotMarker), the grid (QwtPlotGrid), or anything else derived
pixhawk's avatar
pixhawk committed
38 39 40
  from QwtPlotItem.
  A plot can have up to four axes, with each plot item attached to an x- and
  a y axis. The scales at the axes can be explicitely set (QwtScaleDiv), or
41 42
  are calculated from the plot items, using algorithms (QwtScaleEngine) which
  can be configured separately for each axis.
pixhawk's avatar
pixhawk committed
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

  \image html plot.png

  \par Example
  The following example shows (schematically) the most simple
  way to use QwtPlot. By default, only the left and bottom axes are
  visible and their scales are computed automatically.
  \verbatim
#include <qwt_plot.h>
#include <qwt_plot_curve.h>

QwtPlot *myPlot;
double x[100], y1[100], y2[100];        // x and y values

myPlot = new QwtPlot("Two Curves", parent);

// add curves
QwtPlotCurve *curve1 = new QwtPlotCurve("Curve 1");
QwtPlotCurve *curve2 = new QwtPlotCurve("Curve 2");

getSomeValues(x, y1, y2);

// copy the data into the curves
curve1->setData(x, y1, 100);
curve2->setData(x, y2, 100);

curve1->attach(myPlot);
curve2->attach(myPlot);

// finally, refresh the plot
myPlot->replot();
\endverbatim
*/

class QWT_EXPORT QwtPlot: public QFrame, public QwtPlotDict
{
    friend class QwtPlotCanvas;

    Q_OBJECT
82 83
    Q_PROPERTY( QString propertiesDocument
                READ grabProperties WRITE applyProperties )
pixhawk's avatar
pixhawk committed
84 85 86

public:
    //! Axis index
87 88 89 90 91 92 93
    enum Axis {
        yLeft,
        yRight,
        xBottom,
        xTop,

        axisCnt
pixhawk's avatar
pixhawk committed
94 95
    };

96
    /*!
pixhawk's avatar
pixhawk committed
97 98
        \brief Position of the legend, relative to the canvas.

99 100
        ExternalLegend means that only the content of the legend
        will be handled by QwtPlot, but not its geometry.
pixhawk's avatar
pixhawk committed
101 102 103
        This might be interesting if an application wants to
        have a legend in an external window.
     */
104
    enum LegendPosition {
pixhawk's avatar
pixhawk committed
105 106 107 108
        LeftLegend,
        RightLegend,
        BottomLegend,
        TopLegend,
109

pixhawk's avatar
pixhawk committed
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
        ExternalLegend
    };

    explicit QwtPlot(QWidget * = NULL);
    explicit QwtPlot(const QwtText &title, QWidget *p = NULL);
#if QT_VERSION < 0x040000
    explicit QwtPlot(QWidget *, const char* name);
#endif

    virtual ~QwtPlot();

    void applyProperties(const QString &);
    QString grabProperties() const;

    void setAutoReplot(bool tf = true);
    bool autoReplot() const;

    void print(QPaintDevice &p,
128
               const QwtPlotPrintFilter & = QwtPlotPrintFilter()) const;
pixhawk's avatar
pixhawk committed
129
    virtual void print(QPainter *, const QRect &rect,
130
                       const QwtPlotPrintFilter & = QwtPlotPrintFilter()) const;
pixhawk's avatar
pixhawk committed
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 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210

    // Layout

    QwtPlotLayout *plotLayout();
    const QwtPlotLayout *plotLayout() const;

    void setMargin(int margin);
    int margin() const;

    // Title

    void setTitle(const QString &);
    void setTitle(const QwtText &t);
    QwtText title() const;

    QwtTextLabel *titleLabel();
    const QwtTextLabel *titleLabel() const;

    // Canvas

    QwtPlotCanvas *canvas();
    const QwtPlotCanvas *canvas() const;

    void setCanvasBackground (const QColor &c);
    const QColor& canvasBackground() const;

    void setCanvasLineWidth(int w);
    int canvasLineWidth() const;

    virtual QwtScaleMap canvasMap(int axisId) const;

    double invTransform(int axisId, int pos) const;
    int transform(int axisId, double value) const;

    // Axes

    QwtScaleEngine *axisScaleEngine(int axisId);
    const QwtScaleEngine *axisScaleEngine(int axisId) const;
    void setAxisScaleEngine(int axisId, QwtScaleEngine *);

    void setAxisAutoScale(int axisId);
    bool axisAutoScale(int axisId) const;

    void enableAxis(int axisId, bool tf = true);
    bool axisEnabled(int axisId) const;

    void setAxisFont(int axisId, const QFont &f);
    QFont axisFont(int axisId) const;

    void setAxisScale(int axisId, double min, double max, double step = 0);
    void setAxisScaleDiv(int axisId, const QwtScaleDiv &);
    void setAxisScaleDraw(int axisId, QwtScaleDraw *);

    double axisStepSize(int axisId) const;

    const QwtScaleDiv *axisScaleDiv(int axisId) const;
    QwtScaleDiv *axisScaleDiv(int axisId);

    const QwtScaleDraw *axisScaleDraw(int axisId) const;
    QwtScaleDraw *axisScaleDraw(int axisId);

    const QwtScaleWidget *axisWidget(int axisId) const;
    QwtScaleWidget *axisWidget(int axisId);

#if QT_VERSION < 0x040000
    void setAxisLabelAlignment(int axisId, int);
#else
    void setAxisLabelAlignment(int axisId, Qt::Alignment);
#endif
    void setAxisLabelRotation(int axisId, double rotation);

    void setAxisTitle(int axisId, const QString &);
    void setAxisTitle(int axisId, const QwtText &);
    QwtText axisTitle(int axisId) const;

    void setAxisMaxMinor(int axisId, int maxMinor);
    int axisMaxMajor(int axisId) const;
    void setAxisMaxMajor(int axisId, int maxMajor);
    int axisMaxMinor(int axisId) const;

211
    // Legend
pixhawk's avatar
pixhawk committed
212 213

    void insertLegend(QwtLegend *, LegendPosition = QwtPlot::RightLegend,
214
                      double ratio = -1.0);
pixhawk's avatar
pixhawk committed
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230

    QwtLegend *legend();
    const QwtLegend *legend() const;

    // Misc

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

    virtual void updateLayout();

    virtual bool event(QEvent *);

signals:
    /*!
231 232
      A signal which is emitted when the user has clicked on
      a legend item, which is in QwtLegend::ClickableItem mode.
pixhawk's avatar
pixhawk committed
233 234 235 236 237 238 239 240 241 242

      \param plotItem Corresponding plot item of the
                 selected legend item

      \note clicks are disabled as default
      \sa QwtLegend::setItemMode, QwtLegend::itemMode
     */
    void legendClicked(QwtPlotItem *plotItem);

    /*!
243
      A signal which is emitted when the user has clicked on
pixhawk's avatar
pixhawk committed
244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
      a legend item, which is in QwtLegend::CheckableItem mode

      \param plotItem Corresponding plot item of the
                 selected legend item
      \param on True when the legen item is checked

      \note clicks are disabled as default
      \sa QwtLegend::setItemMode, QwtLegend::itemMode
     */

    void legendChecked(QwtPlotItem *plotItem, bool on);

public slots:
    virtual void clear();

    virtual void replot();
    void autoRefresh();

protected slots:
    virtual void legendItemClicked();
    virtual void legendItemChecked(bool);

protected:
    static bool axisValid(int axisId);

    virtual void drawCanvas(QPainter *);
    virtual void drawItems(QPainter *, const QRect &,
271 272
                           const QwtScaleMap maps[axisCnt],
                           const QwtPlotPrintFilter &) const;
pixhawk's avatar
pixhawk committed
273 274 275 276 277 278 279

    virtual void updateTabOrder();

    void updateAxes();

    virtual void resizeEvent(QResizeEvent *e);

280 281
    virtual void printLegendItem(QPainter *,
                                 const QWidget *, const QRect &) const;
pixhawk's avatar
pixhawk committed
282 283 284 285

    virtual void printTitle(QPainter *, const QRect &) const;

    virtual void printScale(QPainter *, int axisId, int startDist, int endDist,
286
                            int baseDist, const QRect &) const;
pixhawk's avatar
pixhawk committed
287

288 289 290
    virtual void printCanvas(QPainter *,
                             const QRect &boundingRect, const QRect &canvasRect,
                             const QwtScaleMap maps[axisCnt], const QwtPlotPrintFilter &) const;
pixhawk's avatar
pixhawk committed
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308

    virtual void printLegend(QPainter *, const QRect &) const;

private:
    void initAxesData();
    void deleteAxesData();
    void updateScaleDiv();

    void initPlot(const QwtText &title);

    class AxisData;
    AxisData *d_axisData[axisCnt];

    class PrivateData;
    PrivateData *d_data;
};

#endif