6

我的QDoubleSpinBox范围为 0-7000,但希望该值始终显示为 4 位数字(0-> 0000、1 -> 0001、30 -> 0030、3333 -> 3333)。

我知道我可以添加前缀,但总是添加前缀。我有哪些选择?

4

2 回答 2

11

如果你使用整数,那么QSpinBox就足够了。

您可以简单地继承QSpinBox并重新实现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'));
    }
};

QString以这种方式填充就可以了。

于 2014-10-23T22:30:29.433 回答
1

prefix如果您考虑负值,这不是一个选项解决方案,因此在我看来,最好和最优雅的解决方案是通过派生来定义您自己的自定义旋转框QAbstractSpinBox。这是一个小例子:

请注意,它远非完美,它只是作为可以做什么的示例:

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

我没有提供任何评论,因为我认为它非常直截了当,但如果需要,我可以添加更多解释。

我希望这有帮助。

于 2014-10-24T00:15:55.217 回答