2014-10-23 18 views

Trả lời

9

Nếu bạn sử dụng số nguyên thì QSpinBox sẽ là đủ.

Bạn chỉ có thể kế thừa từ QSpinBox và tái thực hiện các chức năng textFromValue:

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

Điền QString cách này làm các trick.

1

prefix không phải là giải pháp tùy chọn nếu bạn xem xét giá trị âm, theo ý kiến ​​của tôi, giải pháp tốt nhất và thanh lịch nhất là xác định hộp xoay tùy chỉnh của bạn bằng cách lấy QAbstractSpinBox. Dưới đây là một ví dụ nhỏ:

Lưu ý rằng nó là xa hoàn hảo và nó phục vụ chỉ là một ví dụ về những gì có thể được thực hiện:

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

Tôi không đưa ra bất kỳ bình luận nào vì tôi cho rằng nó khá thẳng về phía trước, nhưng nếu cần tôi có thể thêm một vài giải thích nữa.

Tôi hy vọng điều này sẽ hữu ích.

+0

lớp riêng là giải pháp, nhưng ghi đè văn bảnTừ giá trị dường như là đủ (xem ở trên) –

Các vấn đề liên quan