power_bar.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from PyQt5 import QtWidgets, QtGui, QtCore
  2. from PyQt5.QtCore import Qt
  3. class _Bar(QtWidgets.QWidget):
  4. def __init__(self, *args, **kwargs):
  5. super().__init__(*args, **kwargs)
  6. self.setSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding,
  7. QtWidgets.QSizePolicy.MinimumExpanding)
  8. def sizeHint(self):
  9. return QtCore.QSize(40, 120)
  10. def paintEvent(self, e):
  11. painter = QtGui.QPainter(self)
  12. brush = QtGui.QBrush()
  13. brush.setColor(QtGui.QColor('black'))
  14. brush.setStyle(Qt.SolidPattern)
  15. rect = QtCore.QRect(0, 0,
  16. painter.device().width(),
  17. painter.device().height())
  18. painter.fillRect(rect, brush)
  19. # Get current state.
  20. dial = self.parent()._dial
  21. vmin, vmax = dial.minimum(), dial.maximum()
  22. value = dial.value()
  23. pc = (value - vmin) / (vmax - vmin)
  24. n_steps_to_draw = int(pc * 5)
  25. # Define our canvas
  26. padding = 5
  27. d_height = painter.device().height() - (padding * 2)
  28. d_width = painter.device().width() - (padding * 2)
  29. # Draw the bars
  30. step_size = d_height / 5
  31. bar_height = int(step_size * 0.6)
  32. bar_spacer = int(step_size * 0.4 / 2)
  33. brush.setColor(QtGui.QColor('red'))
  34. for n in range(n_steps_to_draw):
  35. rect = QtCore.QRect(
  36. padding,
  37. int(padding + d_height - ((n + 1) * step_size) + bar_spacer),
  38. d_width, bar_height)
  39. painter.fillRect(rect, brush)
  40. def _trigger_refresh(self):
  41. self.update()
  42. class PowerBar(QtWidgets.QWidget):
  43. """
  44. Custom Qt Widget to show a power bar and dial.
  45. Demonstrating compound and custom-drawn widget.
  46. """
  47. def __init__(self, steps=5, *args, **kwargs):
  48. super(PowerBar, self).__init__(*args, **kwargs)
  49. layout = QtWidgets.QVBoxLayout()
  50. self._bar = _Bar()
  51. layout.addWidget(self._bar)
  52. self._dial = QtWidgets.QDial()
  53. layout.addWidget(self._dial)
  54. self.setLayout(layout)
  55. self._dial.valueChanged.connect(self._bar._trigger_refresh)
  56. if __name__ == '__main__':
  57. app = QtWidgets.QApplication([])
  58. volume = PowerBar()
  59. volume.show()
  60. app.exec_()