diff --git a/sdrgui/CMakeLists.txt b/sdrgui/CMakeLists.txt
index e0d590907..0d9a3ad49 100644
--- a/sdrgui/CMakeLists.txt
+++ b/sdrgui/CMakeLists.txt
@@ -65,6 +65,7 @@ set(sdrgui_SOURCES
gui/samplingdevicedialog.cpp
gui/scaleengine.cpp
gui/scaledimage.cpp
+ gui/scidoublespinbox.cpp
gui/sdrangelsplash.cpp
gui/spectrumcalibrationpointsdialog.cpp
gui/spectrummarkersdialog.cpp
@@ -168,6 +169,7 @@ set(sdrgui_HEADERS
gui/samplingdevicedialog.h
gui/scaleengine.h
gui/scaledimage.h
+ gui/scidoublespinbox.h
gui/sdrangelsplash.h
gui/spectrumcalibrationpointsdialog.h
gui/spectrummarkersdialog.h
diff --git a/sdrgui/gui/scidoublespinbox.cpp b/sdrgui/gui/scidoublespinbox.cpp
new file mode 100644
index 000000000..21b904881
--- /dev/null
+++ b/sdrgui/gui/scidoublespinbox.cpp
@@ -0,0 +1,60 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2022 Jon Beniston, M7RCE //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// (at your option) any later version. //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#include "scidoublespinbox.h"
+
+SciDoubleSpinBox::SciDoubleSpinBox(QWidget *parent) :
+ QDoubleSpinBox(parent)
+{
+}
+
+double SciDoubleSpinBox::valueFromText(const QString &text) const
+{
+ return text.toDouble();
+}
+
+QValidator::State SciDoubleSpinBox::validate(QString &input, int &pos) const
+{
+ bool ok;
+ input.toDouble(&ok);
+ if (ok) {
+ return QValidator::Acceptable;
+ }
+
+ QString validChars = "0123456789+-.e"; // 'C' locale, so no , separator
+
+ for (int i = 0; i < input.size(); i++)
+ {
+ if (validChars.indexOf(input[i]) == -1) {
+ return QValidator::Invalid;
+ }
+ }
+ if (input.count('e') > 1) {
+ return QValidator::Invalid;
+ }
+ if (input.count('.') > 1) {
+ return QValidator::Invalid;
+ }
+ if (input.count('+') > 2) {
+ return QValidator::Invalid;
+ }
+ if (input.count('-') > 2) {
+ return QValidator::Invalid;
+ }
+
+ return QValidator::Intermediate;
+}
diff --git a/sdrgui/gui/scidoublespinbox.h b/sdrgui/gui/scidoublespinbox.h
new file mode 100644
index 000000000..c8ac1e3bf
--- /dev/null
+++ b/sdrgui/gui/scidoublespinbox.h
@@ -0,0 +1,39 @@
+///////////////////////////////////////////////////////////////////////////////////
+// Copyright (C) 2022 Jon Beniston, M7RCE //
+// //
+// This program is free software; you can redistribute it and/or modify //
+// it under the terms of the GNU General Public License as published by //
+// the Free Software Foundation as version 3 of the License, or //
+// (at your option) any later version. //
+// //
+// This program is distributed in the hope that it will be useful, //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
+// GNU General Public License V3 for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program. If not, see . //
+///////////////////////////////////////////////////////////////////////////////////
+
+#ifndef SDRGUI_GUI_SCIDOUBLESPINBOX_H
+#define SDRGUI_GUI_SCIDOUBLESPINBOX_H
+
+#include
+
+#include "export.h"
+
+// Scientific double spin box.
+// Like a double spin box, except that we additionally scientific E notation for entry
+// (E.g. 4.5e-4)
+class SDRGUI_API SciDoubleSpinBox : public QDoubleSpinBox {
+ Q_OBJECT
+
+public:
+
+ explicit SciDoubleSpinBox(QWidget *parent = nullptr);
+
+ virtual double valueFromText(const QString &text) const;
+ virtual QValidator::State validate(QString &input, int &pos) const;
+};
+
+#endif // SDRGUI_GUI_SCIDOUBLESPINBOX_H