Sound Meter With PyQt
This is a simple reimplementation of QProgressBar, I am trying to build a sound meter with PyQt and I made a custom widget for meter. This is really in early dev stage. And this will be help you to know about reimplementing some stuff in a widget.
Test Video:
Here is the source code for Widget
MQProgressBar.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
import os from PyQt4 import QtGui, QtCore, uic class MQProgressBar(QtGui.QProgressBar): def __init__(self): super(MQProgressBar, self).__init__() self.setTextVisible(False) self.__chunkOpen = False self.__heightDiff = 0 self.__blockStyle = False def setChunkOn(self, mode, value = 0): if mode: self.chunk_mode = QtGui.QFrame(self) self.chunk_mode.setFrameShadow(QtGui.QFrame.Raised) self.chunk_mode.setLineWidth(2) if self.orientation() == QtCore.Qt.Vertical: self.chunk_mode.setFrameShape(QtGui.QFrame.HLine) else: self.chunk_mode.setFrameShape(QtGui.QFrame.VLine) self.__chunkOpen = True def setValue(self,int): get_current_val = self.value() self.updateChunk(get_current_val) QtGui.QProgressBar.setValue(self,int) def updateChunk(self, value): current_x = self.height() current_y = self.width() self.__heightDiff update_val = 5 if value >= 99: return elif value > 30: update_val = 10 if self.orientation() == QtCore.Qt.Vertical: self.chunk_mode.move(0, ((current_x - 30) - (value * current_x / 100 - update_val))) else: self.chunk_mode.move(((value * current_y / 100 - 20)) - (current_y - 80), 0) def setPeakColor(self,color): self.chunk_mode.setPalette(QtGui.QPalette(color)) def resizeEvent(self, event): current_x = self.height() current_y = self.width() value = self.value() old_size = event.oldSize() if self.orientation() == QtCore.Qt.Vertical: old_hight = old_size.height() updated_height = current_x - old_hight self.chunk_mode.move(0, current_x - 20) if value > 0: self.chunk_mode.move(0, ((current_x - 30) - (value * current_x / 100 - 20))) else: old_hight = old_size.width() updated_height = current_y - old_hight self.chunk_mode.move( current_y - 80 , 0) if value > 0: self.chunk_mode.move(((value * current_y / 100 - 20)) - (current_y - 80), 0) self.__heightDiff = updated_height QtGui.QProgressBar.resizeEvent(self,event) def peakVisible(self): return self.__chunkOpen def setMeterColor(self, start_color = "green" , end_color = "red"): mode_val = "horizontal" if self.orientation() == QtCore.Qt.Vertical: mode_val = "vertical" if self.__blockStyle: self.setStyleSheet ("QProgressBar::chunk:%s {background: qlineargradient(x1: 0, y1: 0.5, x2: 1, y2: 0.5, stop: 0 %s, stop: 1 %s);margin-top: 2px; height: 10px;}" % (mode_val, end_color, end_color)) else: self.setStyleSheet ("QProgressBar::chunk:%s {background-color: qlineargradient(x1: 1, y1: 0, x2: 1, y2: 1, stop: 0 %s, stop: 1 %s);}" % (mode_val,end_color, start_color)) else: if self.__blockStyle: self.setStyleSheet ("QProgressBar::chunk:%s {background: qlineargradient(x1: 0, y1: 0.5, x2: 1, y2: 0.5, stop: 0 %s, stop: 1 %s);margin-right: 2px; width: 10px;}" % (mode_val, end_color, end_color)) else: self.setStyleSheet ("QProgressBar::chunk:%s {background-color: qlineargradient(x1: 0, y1: 1, x2: 1, y2: 1, stop: 0 %s, stop: 1 %s);}" % (mode_val,start_color, end_color)) def setBlockStyle(self, mode): self.__blockStyle = mode self.setMeterColor() def setMeterBorder(self, color): self.setStyleSheet("%sQProgressBar {width: 25px;border: 2px solid %s; border-radius: 8px; background: #494E58;text-align: center;padding: 0px;}" % (self.styleSheet(), color)) |
Here is the example window which has the MQProgressBar implemented.
progress_test.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
import os import sys import random from PyQt4 import QtGui, QtCore, uic import MQProgressBar as MQProgressBar class PBRTEST(QtGui.QWidget): def __init__(self): super(PBRTEST, self).__init__() self.initUI() def initUI(self): self.mypb = MQProgressBar.MQProgressBar() self.mypb.setOrientation(QtCore.Qt.Vertical) self.mypb.setChunkOn(True) self.mypb.setPeakColor(QtGui.QColor(253, 215, 42)) self.mypb.setMeterColor("green","yellow") self.mypb.setMeterBorder("black") self.timer = QtCore.QBasicTimer() self.step = 0 self.mypb1 = MQProgressBar.MQProgressBar() self.mypb1.setOrientation(QtCore.Qt.Vertical) self.mypb1.setChunkOn(True) self.mypb1.setPeakColor(QtGui.QColor(250, 0, 0)) self.mypb1.setMeterColor("black","red") self.mypb2 = MQProgressBar.MQProgressBar() self.mypb2.setOrientation(QtCore.Qt.Horizontal) self.mypb2.setChunkOn(True) self.mypb2.setPeakColor(QtGui.QColor(250, 0, 0)) self.mypb2.setMeterColor("black","red") self.mypb2.setBlockStyle(True) self.mypb2.setMeterBorder("yellow") self.mypb3 = MQProgressBar.MQProgressBar() self.mypb3.setOrientation(QtCore.Qt.Vertical) self.mypb3.setChunkOn(True) self.mypb3.setPeakColor(QtGui.QColor(0, 250, 250)) self.mypb3.setMeterColor("black","green") self.mypb3.setBlockStyle(True) self.mypb3.setMeterBorder("blue") self.mypb4 = MQProgressBar.MQProgressBar() self.mypb4.setOrientation(QtCore.Qt.Vertical) self.mypb4.setChunkOn(True) self.mypb4.setPeakColor(QtGui.QColor(0, 250, 250)) self.btn = QtGui.QPushButton('Start', self) self.btn.clicked.connect(self.doAction) hbox = QtGui.QHBoxLayout() hbox.addWidget(self.mypb) hbox.addWidget(self.mypb1) hbox.addWidget(self.mypb2) hbox.addWidget(self.mypb3) hbox.addWidget(self.mypb4) vbox = QtGui.QVBoxLayout() vbox.addLayout(hbox) vbox.addWidget(self.btn) self.setLayout(vbox) self.setGeometry(1500, 1500, 450, 500) self.setWindowTitle('Progress Test') self.show() def gen_rand_val(self): rand_val = random.randint(0,100) self.mypb1.setValue(rand_val) self.mypb3.setValue(rand_val) def timerEvent(self, e): if self.step >= 100: self.timer.stop() return self.step = self.step + 1 self.mypb.setValue(self.step) self.gen_rand_val() self.mypb2.setValue(self.step) self.mypb4.setValue(self.step) def doAction(self): if self.timer.isActive(): self.timer.stop() else: self.timer.start(100, self) def run(): app = QtGui.QApplication(sys.argv) ex = PBRTEST() ex.show() sys.exit(app.exec_()) if __name__ == "__main__": run() |