#include "fancyslider.h" #include "qboxlayout.h" #include <cmath> FancySlider::FancySlider(QWidget *parent) : QWidget{parent} { QHBoxLayout* hbox = new QHBoxLayout(this); hbox->setMargin(0); hbox->setContentsMargins(0, 0, 0, 0); setLayout(hbox); slider = new QSlider(); slider->setOrientation(Qt::Orientation::Horizontal); slider->setMaximum(sliderResolution); box = new QDoubleSpinBox(); label = new QLabel(); layout()->addWidget(slider); layout()->addWidget(box); layout()->addWidget(label); connect(box, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &FancySlider::setValue); connect(slider, &QSlider::valueChanged, this, [&](int v) { setValue(((v / (double)sliderResolution) * (max - min)) + min); }); } void FancySlider::setValue(double v) { if (v != value) { value = v; updateValues(); emit valueChanged(value); } } void FancySlider::updateValues() { box->setMaximum(max); box->setMinimum(min); if (value != box->value()) box->setValue(value); slider->setValue(((value - min) / (max - min)) * sliderResolution); box->setSingleStep((max-min) / sliderResolution); box->setDecimals(std::ceil(-std::log10(box->singleStep()))); }