如何创建具有非线性比例的 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;
};
有没有一种简单的方法可以实现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;
};