首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带前导零的QDoubleSpinBox (总是4位数字)

带前导零的QDoubleSpinBox (总是4位数字)
EN

Stack Overflow用户
提问于 2014-10-23 21:05:51
回答 2查看 4K关注 0票数 6

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

我知道我可以添加一个前缀,但是前缀总是添加的。我有什么选择?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-23 22:30:29

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

您可以简单地从QSpinBox继承并重新实现textFromValue函数:

代码语言:javascript
复制
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是很有意义的。

票数 12
EN

Stack Overflow用户

发布于 2014-10-24 00:15:55

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

请注意,这是远远不够完美的,它只是一个可以做什么的例子:

Q4数字盒.h:

代码语言:javascript
复制
#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

Q4数字盒.h:

代码语言:javascript
复制
#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);
}

我没有提供任何评论,因为我认为这是相当直截了当的,但如果需要,我可以补充几个解释。

我希望这能帮到你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26537473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档