class CCountUp(QLabel): def __init__(self, *args, **kwargs): super(CCountUp, self).__init__(*args, **kwargs) self.isFloat = False # 是否是小数 font = self.font() or QFont() font.setBold(True) self.setFont(font) self.timeline = QTimeLine(6000, self) self.timeline.setEasingCurve(QEasingCurve.OutExpo) self.timeline.frameChanged.connect(self.onFrameChanged) def pause(self): """暂停 """ self.timeline.setPaused(True) def resume(self): """继续 """ self.timeline.resume() def isPaused(self): """是否暂停 """ return self.timeline.state() == QTimeLine.Paused def reset(self): """重置 """ self.timeline.stop() self.isFloat = False # 是否是小数 self.setText('0') def onFrameChanged(self, value): if self.isFloat: value = round(value / 100.0 + 0.00001, 2) value = str(format(value, ',')) self.setText(value + '0' if value.endswith('.0') else value) def setDuration(self, duration): """设置动画持续时间 :param duration: """ self.timeline.setDuration(duration) def setNum(self, number): """设置数字 :param number: int or float """ if isinstance(number, int): self.isFloat = False self.timeline.setFrameRange(0, number) elif isinstance(number, float): self.isFloat = True self.timeline.setFrameRange(0, number * 100) self.timeline.stop() self.setText('0') self.timeline.start()
class Demo(QWidget): def __init__(self): super(Demo, self).__init__() self.resize(600, 600) self.label = QLabel('Hello PyQt5', self) self.label.move(-100, 100) self.timeline = QTimeLine(5000, self) self.timeline.setFrameRange(0, 700) self.timeline.frameChanged.connect(self.set_frame_func) self.timeline.stateChanged.connect( lambda: print(self.timeline.state())) # 1 self.timeline.setLoopCount(0) self.start_btn = QPushButton('Start', self) self.stop_btn = QPushButton('Stop', self) self.pause_btn = QPushButton('Pause', self) self.resume_btn = QPushButton('Resume', self) self.start_btn.clicked.connect(self.timeline.start) # 2 self.stop_btn.clicked.connect(self.timeline.stop) self.pause_btn.clicked.connect(lambda: self.timeline.setPaused(True)) self.resume_btn.clicked.connect(self.timeline.resume) self.h_layout = QHBoxLayout() self.v_layout = QVBoxLayout() self.h_layout.addWidget(self.start_btn) self.h_layout.addWidget(self.stop_btn) self.h_layout.addWidget(self.pause_btn) self.h_layout.addWidget(self.resume_btn) self.v_layout.addStretch(1) self.v_layout.addLayout(self.h_layout) self.setLayout(self.v_layout) def set_frame_func(self, frame): self.label.move(-100 + frame, 100)