Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members | Related Pages

qwt_counter.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
00008  *****************************************************************************/
00009 
00010 #include <qlayout.h>
00011 #include <qlineedit.h>
00012 #include "qwt_counter.h"
00013 #include "qwt_arrbtn.h"
00014 
00024 QwtCounter::QwtCounter(QWidget *parent, const char *name ):
00025     QWidget(parent,name)
00026 {
00027     d_increment[Button1] = 1;
00028     d_increment[Button2] = 10;
00029     d_increment[Button3] = 100;
00030 
00031     QHBoxLayout *layout = new QHBoxLayout(this);
00032     layout->setAutoAdd(TRUE);
00033 
00034     int i;
00035     for(i=0;i<ButtonCnt;i++)
00036     {
00037         QwtArrowButton *btn =
00038             new QwtArrowButton(i+1, Qt::DownArrow,this);
00039         btn->setFocusPolicy(StrongFocus);
00040 
00041         connect(btn, SIGNAL(released()), SLOT(btnReleased()));
00042         connect(btn, SIGNAL(clicked()), SLOT(btnClicked()));
00043 
00044         d_buttonDown[i] = btn;
00045     }
00046 
00047     d_valueEdit = new QLineEdit(this);
00048     d_valueEdit->setReadOnly(TRUE);
00049     d_valueEdit->setFocusPolicy(NoFocus);
00050 
00051     layout->setStretchFactor(d_valueEdit, 10);
00052 
00053     for(i=0;i<ButtonCnt;i++)
00054     {
00055         QwtArrowButton *btn =
00056             new QwtArrowButton(i+1, Qt::UpArrow, this);
00057         btn->setFocusPolicy(StrongFocus);
00058 
00059         connect(btn, SIGNAL(released()), SLOT(btnReleased()));
00060         connect(btn, SIGNAL(clicked()), SLOT(btnClicked()));
00061     
00062         d_buttonUp[i] = btn;
00063     }
00064 
00065     setNumButtons(2);
00066     setRange(0.0,1.0,0.001);
00067     setValue(0.0);
00068 }
00069 
00079 void QwtCounter::setIncSteps(QwtCounter::Button btn, int nSteps)
00080 {
00081     if (( btn >= 0) && (btn < ButtonCnt))
00082        d_increment[btn] = nSteps;
00083 }
00084 
00091 int QwtCounter::incSteps(QwtCounter::Button btn) const
00092 {
00093     if (( btn >= 0) && (btn < ButtonCnt))
00094        return d_increment[btn];
00095 
00096     return 0;
00097 }
00098 
00106 void QwtCounter::setValue(double v)
00107 {
00108     QwtDblRange::setValue(v);
00109 
00110     showNum(value());
00111     updateButtons();
00112 }
00113 
00117 void QwtCounter::valueChange()
00118 {
00119     showNum(value());
00120     updateButtons();
00121 
00122     emit valueChanged(value());
00123 }
00124 
00128 void QwtCounter::updateButtons()
00129 {
00130     for ( int i = 0; i < ButtonCnt; i++ )
00131     {
00132         d_buttonDown[i]->setEnabled(value() > minValue());
00133         d_buttonUp[i]->setEnabled(value() < maxValue());
00134     }
00135 }
00136 
00141 void QwtCounter::setNumButtons(int n)
00142 {
00143         if ( n<0 || n>ButtonCnt )
00144             return;
00145 
00146         for ( int i = 0; i < ButtonCnt; i++ )
00147     {
00148         if ( i < n )
00149         {
00150             d_buttonDown[i]->show();
00151             d_buttonUp[i]->show();
00152         }
00153         else
00154         {
00155             d_buttonDown[i]->hide();
00156             d_buttonUp[i]->hide();
00157         }
00158     }
00159 
00160     d_nButtons = n;
00161 }
00162 
00166 int QwtCounter::numButtons() const 
00167 { 
00168     return d_nButtons; 
00169 }
00170 
00172 void QwtCounter::showNum(double d)
00173 {
00174     QString v;
00175     v.setNum(d);
00176 
00177     d_valueEdit->setText(v);
00178     d_valueEdit->setCursorPosition(0);
00179 }
00180 
00182 void QwtCounter::btnClicked()
00183 {
00184     for ( int i = 0; i < ButtonCnt; i++ )
00185     {
00186         if ( d_buttonUp[i] == sender() )
00187             incValue(d_increment[i]);
00188 
00189         if ( d_buttonDown[i] == sender() )
00190             incValue(-d_increment[i]);
00191     }
00192 }
00193 
00195 void QwtCounter::btnReleased()
00196 {
00197     emit buttonReleased(value());
00198 }
00199 
00207 void QwtCounter::fontChange(const QFont &f)
00208 {
00209     QWidget::fontChange( f );
00210     d_valueEdit->setFont(font());
00211 }
00212 
00214 QSize QwtCounter::sizeHint() const
00215 {
00216     QString tmp;
00217     QFontMetrics fm(d_valueEdit->font());
00218 
00219     int w = fm.width(tmp.setNum(minValue()));
00220     int w1 = fm.width(tmp.setNum(maxValue()));
00221     if ( w1 > w )
00222         w = w1;
00223     w1 = fm.width(tmp.setNum(minValue() + step()));
00224     if ( w1 > w )
00225         w = w1;
00226     w1 = fm.width(tmp.setNum(maxValue() - step()));
00227     if ( w1 > w )
00228         w = w1;
00229 
00230     // QLineEdit::minimumSizeHint is for one char. Subtracting
00231     // the size for the char we get all the margins, frames ...
00232 
00233     w += d_valueEdit->minimumSizeHint().width() - fm.maxWidth();
00234 
00235     // Ok, now we replace default sizeHint of lblValue by
00236     // what we need really need.
00237 
00238     w += QWidget::sizeHint().width() - d_valueEdit->sizeHint().width();
00239 
00240     return QSize(w, QWidget::sizeHint().height());
00241 }
00242 
00244 QSizePolicy QwtCounter::sizePolicy() const
00245 {
00246     QSizePolicy sp;
00247     sp.setHorData( QSizePolicy::Preferred );
00248     sp.setVerData( QSizePolicy::Fixed );
00249     return sp;
00250 }

Generated on Fri Nov 7 14:11:45 2003 for Qwt Developer's Guide by doxygen 1.3.2