当前位置: 首页 > 工具软件 > Double Slider > 使用案例 >

Qt: 实现浮点slider和浮点spinbox

公良泰宁
2023-12-01

Qt默认的QSlider和QSpinbox只能实现整数调整,不能实现浮点的变化,因此设计了如下可实现浮点变化的QFloatSlider和QFloatSpinner:

QFloatSlider.h

class QFloatSlider : public QSlider
{
    Q_OBJECT

public:
    QFloatSlider(QWidget* pParent = NULL);
	
	void setRange(double Min, double Max);
	void setMinimum(double Min);
	double minimum() const;
	void setMaximum(double Max);
	double maximum() const;
	double value() const;

public slots:
	void setValue(int value);
	void setValue(double Value, bool BlockSignals = false);

private slots:

signals:
	void valueChanged(double Value);
	void rangeChanged(double Min, double Max);

private:
	double	m_Multiplier;
};

QFloatSlider.cpp

QFloatSlider::QFloatSlider(QWidget* pParent /*= NULL*/) :
	QSlider(pParent),
	m_Multiplier(10000.0)
{
	connect(this, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));

	setSingleStep(1);

	setOrientation(Qt::Horizontal);
	setFocusPolicy(Qt::NoFocus);
}

void QFloatSlider::setValue(int Value)
{
	emit valueChanged((double)Value / m_Multiplier);
}

void QFloatSlider::setValue(double Value, bool BlockSignals)
{
	QSlider::blockSignals(BlockSignals);

	QSlider::setValue(Value * m_Multiplier);

 	if (!BlockSignals)
 		emit valueChanged(Value);

	QSlider::blockSignals(false);
}

void QFloatSlider::setRange(double Min, double Max)
{
	QSlider::setRange(Min * m_Multiplier, Max * m_Multiplier);

	emit rangeChanged(Min, Max);
}

void QFloatSlider::setMinimum(double Min)
{
	QSlider::setMinimum(Min * m_Multiplier);

	emit rangeChanged(minimum(), maximum());
}

double QFloatSlider::minimum() const
{
	return QSlider::minimum() / m_Multiplier;
}

void QFloatSlider::setMaximum(double Max)
{
	QSlider::setMaximum(Max * m_Multiplier);

	emit rangeChanged(minimum(), maximum());
}

double QFloatSlider::maximum() const
{
	return QSlider::maximum() / m_Multiplier;
}

double QFloatSlider::value() const
{
	int Value = QSlider::value();
	return (double)Value / m_Multiplier;
}

QFloatSpinner.h

class QFloatSpinner : public QDoubleSpinBox
{
	Q_OBJECT

public:

	QFloatSpinner(QWidget* pParent = NULL);;

	virtual QSize sizeHint() const;
	void setValue(double Value, bool BlockSignals = false);
};
QSize QFloatSpinner::sizeHint() const
{
	return QSize(90, 20);
}

QFloatSpinner::QFloatSpinner(QWidget* pParent /*= NULL*/) :
	QDoubleSpinBox(pParent)
{
}

void QFloatSpinner::setValue(double Value, bool BlockSignals)
{
	blockSignals(BlockSignals);

	QDoubleSpinBox::setValue(Value);

	blockSignals(false);
}
 类似资料: