parameter_slider.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. """
  2. Parameter Slider Widget
  3. Slider widget with label and value display for parameter adjustment.
  4. """
  5. from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLabel, QSlider
  6. from PyQt5.QtCore import Qt, pyqtSignal
  7. from PyQt5.QtGui import QFont
  8. class ParameterSlider(QWidget):
  9. """
  10. Slider widget for parameter adjustment.
  11. Signals:
  12. value_changed: Emitted when slider value changes (int)
  13. """
  14. value_changed = pyqtSignal(int)
  15. def __init__(self, label: str, min_val: int = 0, max_val: int = 100,
  16. default_val: int = 50, value_format: str = "{}",
  17. parent=None):
  18. super().__init__(parent)
  19. self.value_format = value_format
  20. self.init_ui(label, min_val, max_val, default_val)
  21. def init_ui(self, label: str, min_val: int, max_val: int, default_val: int):
  22. """Initialize the slider UI."""
  23. layout = QHBoxLayout(self)
  24. layout.setContentsMargins(0, 5, 0, 5)
  25. layout.setSpacing(10)
  26. # Label
  27. label_widget = QLabel(label + ":")
  28. label_widget.setFont(QFont("Arial", 9))
  29. label_widget.setMinimumWidth(70)
  30. layout.addWidget(label_widget)
  31. # Slider
  32. self.slider = QSlider(Qt.Horizontal)
  33. self.slider.setMinimum(min_val)
  34. self.slider.setMaximum(max_val)
  35. self.slider.setValue(default_val)
  36. self.slider.valueChanged.connect(self._on_value_changed)
  37. self.slider.setStyleSheet("""
  38. QSlider::groove:horizontal {
  39. background: #ecf0f1;
  40. height: 15px;
  41. border: 1px solid #bdc3c7;
  42. border-radius: 2px;
  43. }
  44. QSlider::handle:horizontal {
  45. background: #3498db;
  46. width: 20px;
  47. margin: -3px 0;
  48. border-radius: 3px;
  49. }
  50. QSlider::sub-page:horizontal {
  51. background: #3498db;
  52. border-radius: 2px;
  53. }
  54. """)
  55. layout.addWidget(self.slider, 1)
  56. # Value label
  57. self.value_label = QLabel(self.value_format.format(default_val))
  58. self.value_label.setFont(QFont("Arial", 9))
  59. self.value_label.setMinimumWidth(60)
  60. self.value_label.setStyleSheet("color: #2c3e50;")
  61. layout.addWidget(self.value_label)
  62. def _on_value_changed(self, value: int):
  63. """Handle slider value changes."""
  64. self.value_label.setText(self.value_format.format(value))
  65. self.value_changed.emit(value)
  66. def get_value(self) -> int:
  67. """Get current slider value."""
  68. return self.slider.value()
  69. def set_value(self, value: int):
  70. """Set slider value."""
  71. self.slider.setValue(value)