#pragma once #include class QDoubleSpinBox; class QSlider; class QLabel; namespace gui { // 0..1 浮点参数:Slider + DoubleSpinBox(可复用) class Float01ParamControl final : public QWidget { Q_OBJECT public: explicit Float01ParamControl(QWidget* parent = nullptr); void setValue01(double v); double value01() const; void setEnabled(bool on); signals: void valueChanged01(double v); private: void syncFromSlider(); void syncFromSpin(); QSlider* m_slider = nullptr; QDoubleSpinBox* m_spin = nullptr; bool m_block = false; }; // Vec2 参数:两个 DoubleSpinBox(可复用) class Vec2ParamControl final : public QWidget { Q_OBJECT public: explicit Vec2ParamControl(QWidget* parent = nullptr); void setValue(double x, double y); double x() const; double y() const; void setEnabled(bool on); signals: void valueChanged(double x, double y); private: void emitIfChanged(); QDoubleSpinBox* m_x = nullptr; QDoubleSpinBox* m_y = nullptr; bool m_block = false; double m_lastX = 0.0; double m_lastY = 0.0; }; } // namespace gui