2014-10-23 15 views

Antwort

9

Wenn Sie Ganzzahlen verwenden, dann reicht QSpinBox.

Sie können einfach aus QSpinBox erben und neu implementieren die textFromValue Funktion:

class MySpinBox: public QSpinBox 
{ 
    Q_OBJECT 

public: 
    MySpinBox(QWidget * parent = 0) : 
     QSpinBox(parent) 
    { 
    } 

    virtual QString textFromValue (int value) const 
    { 
     /* 4 - number of digits, 10 - base of number, '0' - pad character*/ 
     return QString("%1").arg(value, 4 , 10, QChar('0')); 
    } 
}; 

Füllen QString diese Weise funktioniert der Trick.

1

Da prefix keine Option Lösung ist, wenn Sie negative Werte betrachten, ist die beste und eleganteste Lösung meiner Meinung nach die Definition Ihrer eigenen benutzerdefinierten Spin-Box durch Ableiten QAbstractSpinBox. Hier ist ein kleines Beispiel:

Beachten Sie, dass es weit von Perfektion ist und es dient nur als Beispiel auf das, was getan werden könnte:

q4digitspinbox.h:

#ifndef Q4DIGITSPINBOX_H 
#define Q4DIGITSPINBOX_H 

#include <QAbstractSpinBox> 
#include <QLineEdit> 

class Q4DigitSpinBox : public QAbstractSpinBox 
{ 
    Q_OBJECT 

public: 
    explicit Q4DigitSpinBox(QWidget *parent = 0); 

    StepEnabled stepEnabled() const; 
    double maximum() const; 
    double minimum() const; 
    void setMaximum(double max); 
    void setMinimum(double min); 
    void setRange(double minimum, double maximum); 
    double value() const; 

public slots: 
    virtual void stepBy(int steps); 
    void setValue(double val); 

signals: 
    void valueChanged(double i); 
    void valueChanged(const QString & text); 

private: 
    double m_value; 
    double m_minimum; 
    double m_maximum; 
    QLineEdit m_lineEdit; 
}; 

#endif // Q4DIGITSPINBOX_H 

q4digitspinbox.h:

#include "q4digitspinbox.h" 

Q4DigitSpinBox::Q4DigitSpinBox(QWidget *parent) : 
    QAbstractSpinBox(parent), 
    m_value(0), 
    m_minimum(-99), 
    m_maximum(99) 
{ 
    setLineEdit(&m_lineEdit); 
    setValue(0.0); 
} 

QAbstractSpinBox::StepEnabled Q4DigitSpinBox::stepEnabled() const 
{ 
    return StepUpEnabled | StepDownEnabled; 
} 

double Q4DigitSpinBox::maximum() const 
{ 
    return m_maximum; 
} 

double Q4DigitSpinBox::minimum() const 
{ 
    return m_minimum; 
} 

void Q4DigitSpinBox::setMaximum(double max) 
{ 
    m_maximum = max; 
} 

void Q4DigitSpinBox::setMinimum(double min) 
{ 
    m_minimum = min; 
} 

void Q4DigitSpinBox::setRange(double minimum, double maximum) 
{ 
    m_minimum = minimum; 
    m_maximum = maximum; 
} 

double Q4DigitSpinBox::value() const 
{ 
    return m_value; 
} 

void Q4DigitSpinBox::stepBy(int steps) 
{ 
    m_value += (double)steps/10; 

    if (fabs(m_value - 0) < 0.00001) 
    { 
     m_value = 0; 
    } 

    if(m_value < m_minimum || m_value > m_maximum) 
    { 
     return; 
    } 

    int prefixNumberOfDigits = 4; 
    QString valueAsString = QString("%1").arg((int)m_value); 
    int numberOfDigits = valueAsString.length(); 

    QString prefix; 
    prefixNumberOfDigits -= numberOfDigits; 

    if(prefixNumberOfDigits > 0) 
    { 
     while(prefixNumberOfDigits--) 
     { 
      prefix += "0"; 
     } 
    } 

    QString value; 

    if(m_value < 0) 
    { 
     value = QString("-%1%2").arg(prefix).arg(-m_value); 
    } 
    else 
    { 
     value = QString("%1%2").arg(prefix).arg(m_value); 
    } 

    m_lineEdit.setText(value); 

    emit valueChanged(m_value); 
    emit valueChanged(value); 
} 

void Q4DigitSpinBox::setValue(double val) 
{ 
    if(val < m_minimum || val > m_maximum) 
    { 
     return; 
    } 

    int prefixNumberOfDigits = 4; 
    QString valueAsString = QString("%1").arg((int)val); 
    int numberOfDigits = valueAsString.length(); 

    QString prefix; 
    prefixNumberOfDigits -= numberOfDigits; 

    if(prefixNumberOfDigits > 0) 
    { 
     while(prefixNumberOfDigits--) 
     { 
      prefix += "0"; 
     } 
    } 

    QString value; 

    if(val < 0) 
    { 
     value = QString("-%1%2").arg(prefix).arg(-val); 
    } 
    else 
    { 
     value = QString("%1%2").arg(prefix).arg(val); 
    } 

    m_lineEdit.setText(value); 

    emit valueChanged(val); 
    emit valueChanged(value); 
} 

Ich habe keinen Kommentar zur Verfügung gestellt, da ich es für ziemlich geradlinig hielt, aber wenn nötig, kann ich ein paar weitere Erklärungen hinzufügen.

Ich hoffe, das hilft.

+0

eigene Klasse ist die Lösung, aber überschreiben TextFromValue scheint ausreichend (siehe oben) –

Verwandte Themen