power_bar.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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(
  7. QtWidgets.QSizePolicy.MinimumExpanding,
  8. QtWidgets.QSizePolicy.MinimumExpanding
  9. )
  10. def sizeHint(self):
  11. return QtCore.QSize(40, 120)
  12. def paintEvent(self, e):
  13. painter = QtGui.QPainter(self)
  14. brush = QtGui.QBrush()
  15. brush.setColor(QtGui.QColor('black'))
  16. brush.setStyle(Qt.SolidPattern)
  17. rect = QtCore.QRect(0, 0, painter.device().width(), 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,
  39. bar_height
  40. )
  41. painter.fillRect(rect, brush)
  42. def _trigger_refresh(self):
  43. self.update()
  44. class PowerBar(QtWidgets.QWidget):
  45. """
  46. Custom Qt Widget to show a power bar and dial.
  47. Demonstrating compound and custom-drawn widget.
  48. """
  49. def __init__(self, steps=5, *args, **kwargs):
  50. super(PowerBar, self).__init__(*args, **kwargs)
  51. layout = QtWidgets.QVBoxLayout()
  52. self._bar = _Bar()
  53. layout.addWidget(self._bar)
  54. self._dial = QtWidgets.QDial()
  55. layout.addWidget(self._dial)
  56. self.setLayout(layout)
  57. self._dial.valueChanged.connect(self._bar._trigger_refresh)
  58. if __name__ == '__main__':
  59. app = QtWidgets.QApplication([])
  60. volume = PowerBar()
  61. volume.show()
  62. app.exec_()