2014-10-23 10 views

cevap

9

Tam sayıları kullanırsanız, QSpinBox yeterli olacaktır.

Sadece QSpinBox dan devralabilir ve textFromValue fonksiyonunu yeniden uygulamak:

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')); 
    } 
}; 

bu şekilde hile yok QString Dolum.

1

prefix, negatif değerleri dikkate alırsanız bir seçenek çözüm değil, bence, en iyi ve en zarif çözüm, QAbstractSpinBox türeterek kendi özel döndürme kutusunu tanımlamaktır. İşte küçük bir örnektir:

Not mükemmellik uzak olduğunu ve sadece yapılabilir ne bir örnek teşkil etmektedir:

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); 
} 

Oldukça basit bir şekilde düşündüğümden beri herhangi bir yorum yapmadım ama gerekirse birkaç açıklama daha ekleyebilirim.

Umarım bu yardımcı olur.

+0

kendi sınıfında bir çözümdür, ancak geçersiz kılan textFromValue yeterlidir (yukarıya bakın). –

İlgili konular