qwt_counter.h 4.24 KB
Newer Older
xuebingbing's avatar
xuebingbing 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 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 160 161
/* -*- 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_COUNTER_H
#define QWT_COUNTER_H

#include "qwt_global.h"
#include <qwidget.h>

/*!
  \brief The Counter Widget

  A Counter consists of a label displaying a number and
  one ore more (up to three) push buttons on each side
  of the label which can be used to increment or decrement
  the counter's value.

  A counter has a range from a minimum value to a maximum value
  and a step size. When the wrapping property is set
  the counter is circular.
 
  The number of steps by which a button increments or decrements the value 
  can be specified using setIncSteps(). The number of buttons can be 
  changed with setNumButtons().

  Example:
\code
#include <qwt_counter.h>

QwtCounter *counter = new QwtCounter(parent);

counter->setRange(0.0, 100.0);                  // From 0.0 to 100
counter->setSingleStep( 1.0 );                  // Step size 1.0
counter->setNumButtons(2);                      // Two buttons each side
counter->setIncSteps(QwtCounter::Button1, 1);   // Button 1 increments 1 step
counter->setIncSteps(QwtCounter::Button2, 20);  // Button 2 increments 20 steps

connect(counter, SIGNAL(valueChanged(double)), myClass, SLOT(newValue(double)));
\endcode
 */

class QWT_EXPORT QwtCounter : public QWidget
{
    Q_OBJECT

    Q_PROPERTY( double value READ value WRITE setValue )
    Q_PROPERTY( double minimum READ minimum WRITE setMinimum )
    Q_PROPERTY( double maximum READ maximum WRITE setMaximum )
    Q_PROPERTY( double singleStep READ singleStep WRITE setSingleStep )

    Q_PROPERTY( int numButtons READ numButtons WRITE setNumButtons )
    Q_PROPERTY( int stepButton1 READ stepButton1 WRITE setStepButton1 )
    Q_PROPERTY( int stepButton2 READ stepButton2 WRITE setStepButton2 )
    Q_PROPERTY( int stepButton3 READ stepButton3 WRITE setStepButton3 )

    Q_PROPERTY( bool readOnly READ isReadOnly WRITE setReadOnly )
    Q_PROPERTY( bool wrapping READ wrapping WRITE setWrapping )

public:
    //! Button index
    enum Button
    {
        //! Button intended for minor steps
        Button1,

        //! Button intended for medium steps
        Button2,

        //! Button intended for large steps
        Button3,

        //! Number of buttons
        ButtonCnt
    };

    explicit QwtCounter( QWidget *parent = NULL );
    virtual ~QwtCounter();

    void setValid( bool );
    bool isValid() const;

    void setWrapping( bool );
    bool wrapping() const;

    bool isReadOnly() const;
    void setReadOnly( bool );

    void setNumButtons( int n );
    int numButtons() const;

    void setIncSteps( QwtCounter::Button btn, int nSteps );
    int incSteps( QwtCounter::Button btn ) const;

    virtual QSize sizeHint() const;

    double singleStep() const;
    void setSingleStep( double s );

    void setRange( double min, double max );
    
    double minimum() const;
    void setMinimum( double min );

    double maximum() const;
    void setMaximum( double max );

    void setStepButton1( int nSteps );
    int stepButton1() const;

    void setStepButton2( int nSteps );
    int stepButton2() const;

    void setStepButton3( int nSteps );
    int stepButton3() const;

    double value() const;

public Q_SLOTS:
    void setValue( double );


Q_SIGNALS:
    /*!
        This signal is emitted when a button has been released
        \param value The new value
    */
    void buttonReleased ( double value );

    /*!
        This signal is emitted when the counter's value has changed
        \param value The new value
    */
    void valueChanged ( double value );

protected:
    virtual bool event( QEvent * );
    virtual void wheelEvent( QWheelEvent * );
    virtual void keyPressEvent( QKeyEvent * );

private Q_SLOTS:
    void btnReleased();
    void btnClicked();
    void textChanged();

private:
    void incrementValue( int numSteps );
    void initCounter();
    void updateButtons();
    void showNumber( double );

    class PrivateData;
    PrivateData *d_data;
};

#endif