如何创建具有非线性比例的 QSlider?

How to create a QSlider with a non-linear scale?

有没有一种简单的方法可以实现QSlider的非线性缩放?我想对其实现对数刻度。

我想到的唯一解决方法是在 class.

之外操纵值更改信号

我实现了一个带有比例因子的 LogSlider,它运行良好。

class LogSlider : public QSlider {
  Q_OBJECT
 public:
  explicit LogSlider(QWidget* parent = nullptr, scale = 1000) : QSlider(parent) : m_scale(scale) {
    QObject::connect(this, &QSlider::valueChanged, this,
                     &LogSlider::onValueChanged);
    setOrientation(Qt::Horizontal);
  }

  void setNaturalMin(double min) { setMinimum(int(log10(min) * m_scale)); }
  void setNaturalMax(double max) { setMaximum(int(log10(max) * m_scale)); }
  void setNaturalValue(double value) { setValue(int(log10(value) * m_scale)); }

 private slots:
  void onValueChanged(double value) {
    emit naturalValueChanged(std::pow(10, (value / m_scale));
  }

 signals:
  void naturalValueChanged(double value);

 private:
  double m_scale;
};