20 const double upper_switch = 100;
21 const double lower_switch = 0.1;
22 const double min_val = std::numeric_limits<double>::min();
23 const double max_val = std::numeric_limits<double>::max();
25 bool useExponentialNotation(
double val);
29 : QAbstractSpinBox(parent)
37 locale.setNumberOptions(QLocale::RejectGroupSeparator);
39 m_validator.setNotation(QDoubleValidator::ScientificNotation);
56 if (std::abs(old_val -
m_value) > min_val)
122 QString result = useExponentialNotation(val) ? QString::number(val,
'e', decimal_points)
123 : QString::number(val,
'f', decimal_points);
125 return result.replace(QRegExp(
"(\\.?0+)?((e{1}[\\+|-]{1})(0+)?([1-9]{1}.*))?$"),
"\\3\\5");
129 double max,
double default_value)
132 if (validator.validate(text, pos) == QValidator::Acceptable) {
133 double new_val = validator.locale().toDouble(text);
134 if (std::abs(new_val) < min_val)
136 return new_val >= min && new_val <= max ? new_val : default_value;
138 return default_value;
143 return QString::number(val,
'e',
decimals).toDouble();
148 return isReadOnly() ? StepNone : StepUpEnabled | StepDownEnabled;
154 if (new_text != text())
155 lineEdit()->setText(new_text);
164 bool useExponentialNotation(
double val)
166 const double abs_val = std::abs(val);
168 if (abs_val <= min_val)
171 return abs_val >= upper_switch || abs_val < lower_switch;
Defines class ScientificSpinBox.
ScientificSpinBox(QWidget *parent=nullptr)
void stepBy(int steps) override
static double toDouble(QString text, const QDoubleValidator &validator, double min, double max, double default_value)
void setMaximum(double max)
void setMinimum(double min)
~ScientificSpinBox() override
void setValue(double val)
void setSingleStep(double step)
QDoubleValidator m_validator
static double round(double val, int decimals)
bool inRange(double val) const
QAbstractSpinBox::StepEnabled stepEnabled() const override
static QString toString(double val, int decimal_points)
void valueChanged(double value)
double singleStep() const