Untitled
plain_text
a year ago
3.9 kB
25
No Index
Never
import sys, os, time from PySide6 import QtCore, QtWidgets, QtGui from PySide6.QtWidgets import * from PySide6.QtCore import * from PySide6.QtGui import * class EProgressbar(QProgressBar): valueChanged = QtCore.Signal(int) _val = 0 def __init__(self): super(EProgressbar, self).__init__(None) self.r = 15 self.setFixedHeight(40) self._animation = QtCore.QPropertyAnimation(self, b"_vallll", duration=600) self.valueChanged.connect(self.update) self.setValue(80) def setValue(self, value:int) -> None: self._animation.setStartValue(self.value()) self._animation.setEndValue(value) self._val = value self._animation.start() def value(self) -> int: return self._val def ESetValue(self, value): if self._val != value: self._val = value self.valueChanged.emit(value) _vallll = QtCore.Property(int, fget=value, fset=ESetValue, notify=valueChanged) def paintEvent(self, event: QPaintEvent) -> None: pt = QPainter();pt.begin(self);pt.setRenderHints(QPainter.Antialiasing|QPainter.TextAntialiasing) path = QPainterPath();path2 = QPainterPath(); path3 = QPainterPath() font = QFont('Helvetica', 11, weight=QFont.Bold); font.setStyleHint(QFont.Times, QFont.PreferAntialias) BRUSH_BASE_BACKGROUND, BRUSH_BASE_FOREGROUND, BRUSH_POLYGON, BRUSH_CORNER = QColor(247,247,250), QColor(255,152,91), QColor(255,191,153), QColor(203,203,205) pt.setPen(QPen(BRUSH_CORNER,1.5));pt.setBrush(BRUSH_BASE_BACKGROUND) rect = self.rect().adjusted(2,2,-2,-2)#QRect(1, 0, self.width()-2, self.height()) path.addRoundedRect(rect, self.r, self.r) pt.setBrush(BRUSH_BASE_FOREGROUND) pt.setClipPath(path,Qt.ClipOperation.ReplaceClip) pt.drawPath(path) pt.setBrush(Qt.white) path.addRoundedRect(QRect(2,2, self._vallll/ 100 * self.width()-4, self.height()-4), self.r, self.r) pt.drawPath(path) pt.setPen(Qt.NoPen) pt.setBrush(BRUSH_POLYGON) start_x = 20 y, dx = 3, 6 polygon_width = 14 polygon_space =18 #15#18 progress_filled_width = self.value()/self.maximum()*self.width() #pt.setClipPath(path2, Qt.ClipOperation.ReplaceClip) # bu olmazsa polygon taşıyor, clip yapılması lazım for i in range(100): x = start_x + (i*polygon_width) + (i*polygon_space) if x >= progress_filled_width or (x+ polygon_width >= progress_filled_width): break path.addPolygon(QPolygon([ QPoint(x, y), QPoint(x+polygon_width, y), QPoint(x+polygon_width/2, self.height()-y), QPoint(x-polygon_width/2, self.height()-y)])) #pt.setClipPath(path2, Qt.ClipOperation.ReplaceClip) # bu olmazsa polygon taşıyor, clip yapılması lazım #path.connectPath(path2) #pt.drawPath(path) pt.drawPath(path) pt.setFont(font);pt.setPen(Qt.white) pt.drawText(QRect(2,2,self.width()-4,self.height()-4), Qt.AlignCenter, f"%{self.value()}") pt.end() if __name__ == "__main__": app = QApplication(sys.argv) wind = QMainWindow();wind.setStyleSheet("QMainWindow{background-color:blue}");wind.setWindowTitle("EProgressBar") wind.resize(221,150) wid = QWidget();lay = QHBoxLayout(wid);lay.setAlignment(Qt.AlignCenter) e = EProgressbar();#e.setValue(VAL) timer = QTimer(wind) def lamb(): import random e.setValue(random.randint(0,100)) timer.timeout.connect(lamb) #timer.start(1000) #e.setGeometry(QRect(10,10,170,250)) lay.addWidget(e) wind.setCentralWidget(wid) #e.setParent(wind) wind.show() sys.exit(app.exec())