17 #include <QMouseEvent> 27 #define CLEAR_ICON_SIZE 16 33 static QChar SPECIAL_TEXT_WHEN_EMPTY = QChar( 0x2063 );
35 static constexpr QChar SPECIAL_TEXT_WHEN_EMPTY = QChar( 0x2063 );
40 : QDoubleSpinBox( parent )
42 mLineEdit =
new QgsSpinBoxLineEdit();
45 setLineEdit( mLineEdit );
47 QSize msz = minimumSizeHint();
48 setMinimumSize( msz.width() +
CLEAR_ICON_SIZE + 9 + frameWidth() * 2 + 2,
52 connect(
this, static_cast <
void ( QDoubleSpinBox::* )(
double ) > ( &QDoubleSpinBox::valueChanged ),
this, &QgsDoubleSpinBox::changed );
58 mLineEdit->setShowClearButton( showClearButton );
63 mExpressionsEnabled = enabled;
68 QDoubleSpinBox::changeEvent( event );
70 if ( event->type() == QEvent::FontChange )
72 lineEdit()->setFont( font() );
75 mLineEdit->setShowClearButton( shouldShowClearForValue( value() ) );
80 double step = singleStep();
81 if ( event->modifiers() & Qt::ControlModifier )
84 double newStep = step / 10;
87 newStep = std::max( newStep, std::pow( 10.0, 0.0 - decimals() ) );
89 setSingleStep( newStep );
94 event->setModifiers( event->modifiers() & ~Qt::ControlModifier );
96 QDoubleSpinBox::wheelEvent( event );
97 setSingleStep( step );
106 qApp->processEvents();
107 if ( QApplication::mouseButtons() & Qt::LeftButton )
108 QDoubleSpinBox::timerEvent( event );
113 mLineEdit->setShowClearButton( shouldShowClearForValue( value() ) );
114 QDoubleSpinBox::paintEvent( event );
117 void QgsDoubleSpinBox::changed(
double value )
119 mLineEdit->setShowClearButton( shouldShowClearForValue( value ) );
125 if ( mLineEdit->isNull() )
132 mCustomClearValue = customValue;
134 if ( !specialValueText.isEmpty() )
145 mClearValueMode = mode;
146 mCustomClearValue = 0;
148 if ( !clearValueText.isEmpty() )
164 return mCustomClearValue;
169 mLineEdit->setAlignment( alignment );
176 QDoubleSpinBox::setSpecialValueText( SPECIAL_TEXT_WHEN_EMPTY );
177 mLineEdit->setNullValue( SPECIAL_TEXT_WHEN_EMPTY );
181 QDoubleSpinBox::setSpecialValueText( txt );
182 mLineEdit->setNullValue( txt );
186 QString QgsDoubleSpinBox::stripped(
const QString &originalText )
const 190 QString text = originalText;
191 if ( specialValueText().isEmpty() || text != specialValueText() )
194 if ( text.contains( SPECIAL_TEXT_WHEN_EMPTY ) )
195 text = text.replace( SPECIAL_TEXT_WHEN_EMPTY, QString() );
197 int size = text.size();
198 bool changed =
false;
199 if ( !prefix().isEmpty() && text.startsWith( prefix() ) )
201 from += prefix().size();
205 if ( !suffix().isEmpty() && text.endsWith( suffix() ) )
207 size -= suffix().size();
211 text = text.mid( from, size );
214 text = text.trimmed();
221 if ( !mExpressionsEnabled )
223 return QDoubleSpinBox::valueFromText( text );
226 QString trimmedText = stripped( text );
227 if ( trimmedText.isEmpty() )
229 return mShowClearButton ?
clearValue() : value();
237 if ( !mExpressionsEnabled )
239 QValidator::State r = QDoubleSpinBox::validate( input, pos );
243 return QValidator::Acceptable;
246 int QgsDoubleSpinBox::frameWidth()
const 248 return style()->pixelMetric( QStyle::PM_DefaultFrameWidth );
251 bool QgsDoubleSpinBox::shouldShowClearForValue(
const double value )
const 253 if ( !mShowClearButton || !isEnabled() )
void wheelEvent(QWheelEvent *event) override
void paintEvent(QPaintEvent *e) override
void setExpressionsEnabled(bool enabled)
Sets if the widget will allow entry of simple expressions, which are evaluated and then discarded...
QValidator::State validate(QString &input, int &pos) const override
void setShowClearButton(bool showClearButton)
Sets whether the widget will show a clear button.
Reset value to custom value (see setClearValue() )
static double evaluateToDouble(const QString &text, double fallbackValue)
Attempts to evaluate a text string as an expression to a resultant double value.
void setSpecialValueText(const QString &txt)
Set the special-value text to be txt If set, the spin box will display this text instead of a numeric...
QgsDoubleSpinBox(QWidget *parent=nullptr)
Constructor for QgsDoubleSpinBox.
ClearValueMode
Behavior when widget is cleared.
void clear() override
Sets the current value to the value defined by the clear value.
bool showClearButton() const
Returns whether the widget is showing a clear button.
double valueFromText(const QString &text) const override
void setClearValue(double customValue, const QString &clearValueText=QString())
Defines the clear value as a custom value and will automatically set the clear value mode to CustomVa...
double clearValue() const
Returns the value used when clear() is called.
void timerEvent(QTimerEvent *event) override
void changeEvent(QEvent *event) override
void setLineEditAlignment(Qt::Alignment alignment)
Set alignment in the embedded line edit widget.
void setClearValueMode(ClearValueMode mode, const QString &clearValueText=QString())
Defines if the clear value should be the minimum or maximum values of the widget or a custom value...
void cleared()
Emitted when the widget is cleared.