【问题标题】:QDoubleSpinBox with leading zeros (always 4 digits)带前导零的 QDoubleSpinBox(始终为 4 位)
【发布时间】:2014-12-19 16:12:00
【问题描述】:

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

我知道我可以添加prefix,但始终会添加前缀。 我有哪些选择?

【问题讨论】:

    标签: qt qwidget qspinbox


    【解决方案1】:

    如果你使用整数,那么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 就可以了。

    【讨论】:

      【解决方案2】:

      由于如果您考虑负值,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);
      }
      

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

      我希望这会有所帮助。

      【讨论】:

      • 自己的类是解决方案,但覆盖 textFromValue 似乎就足够了(见上文)
      猜你喜欢
      • 1970-01-01
      • 2021-05-21
      • 2023-02-22
      • 2023-04-02
      • 2014-03-21
      • 1970-01-01
      • 2016-01-29
      • 2019-01-25
      • 1970-01-01
      相关资源
      最近更新 更多