diff --git a/QtWinExtras/README.en.md b/QtWinExtras/README.en.md new file mode 100644 index 0000000..e69de29 diff --git a/QtWinExtras/README.md b/QtWinExtras/README.md new file mode 100644 index 0000000..a38a4f3 --- /dev/null +++ b/QtWinExtras/README.md @@ -0,0 +1,11 @@ +# QtWinExtras + +- 目录 + - [任务栏进度条](#1任务栏进度条) + +## 1、任务栏进度条 +[运行 TaskbarProgress.py](TaskbarProgress.py) + +`QWinTaskbarProgress`类似和`QProgressBar`一样的操作 + +![TaskbarProgress](ScreenShot/TaskbarProgress.gif) \ No newline at end of file diff --git a/QtWinExtras/ScreenShot/TaskbarProgress.gif b/QtWinExtras/ScreenShot/TaskbarProgress.gif new file mode 100644 index 0000000..5193d96 Binary files /dev/null and b/QtWinExtras/ScreenShot/TaskbarProgress.gif differ diff --git a/QtWinExtras/TaskbarProgress.py b/QtWinExtras/TaskbarProgress.py new file mode 100644 index 0000000..56f151b --- /dev/null +++ b/QtWinExtras/TaskbarProgress.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Created on 2020/7/1 +@author: Irony +@site: https://pyqt.site https://github.com/PyQt5 +@email: 892768447@qq.com +@file: TaskbarProgress +@description: +""" + +__Author__ = 'Irony' +__Copyright__ = 'Copyright (c) 2020' +__Version__ = 'Version 1.0' + +import cgitb +import sys + +from PyQt5.QtCore import QTimer +from PyQt5.QtWidgets import QWidget, QApplication, QGridLayout, QSpinBox, QPushButton, QLabel +from PyQt5.QtWinExtras import QWinTaskbarButton + + +class Window(QWidget): + + def __init__(self, *args, **kwargs): + super(Window, self).__init__(*args, **kwargs) + # 获取任务栏按钮 + self.taskButton = QWinTaskbarButton(self) + # 获取任务栏进度条 + self.taskProgress = self.taskButton.progress() + # 定时器模拟进度 + self.timerProgress = QTimer(self) + self.timerProgress.timeout.connect(self.update_progress) + + self.setup_ui() + + def showEvent(self, event): + super(Window, self).showEvent(event) + if not self.taskButton.window(): + # 必须等窗口显示后设置才有效,或者通过软件流程在适当的时候设置也可以 + self.taskButton.setWindow(self.windowHandle()) + self.taskProgress.show() + + def closeEvent(self, event): + self.timerProgress.stop() + super(Window, self).closeEvent(event) + + def setup_ui(self): + layout = QGridLayout(self) + + # 设置最新小值和最大值 + self.spinBoxMin = QSpinBox(self) + self.spinBoxMax = QSpinBox(self) + self.spinBoxMax.setMaximum(100) + self.spinBoxMax.setValue(100) + layout.addWidget(self.spinBoxMin, 0, 0) + layout.addWidget(self.spinBoxMax, 0, 1) + layout.addWidget(QPushButton('设置范围值', self, clicked=self.set_range), 0, 2) + + # 设置当前值 + self.spinBoxCur = QSpinBox(self) + self.spinBoxCur.setMaximum(100) + self.spinBoxCur.setValue(50) + layout.addWidget(self.spinBoxCur, 0, 3) + layout.addWidget(QPushButton('设置当前值', self, clicked=self.set_current_value), 0, 4) + + # 功能按钮 + layout.addWidget(QPushButton('隐藏', self, clicked=self.set_show_hide), 1, 0) + layout.addWidget(QPushButton('暂停', self, clicked=self.set_pause_resume), 1, 1) + layout.addWidget(QPushButton('重置', self, clicked=self.set_reset), 1, 2) + layout.addWidget(QPushButton('停止', self, clicked=self.set_stop), 1, 3) + layout.addWidget(QPushButton('不可见', self, clicked=self.set_visible), 1, 4) + + # 模拟进度 + layout.addWidget(QPushButton('模拟进度动画', self, clicked=self.start_progress), 2, 0, 1, 5) + + # 状态 + layout.addWidget(QLabel('暂停信号 :', self), 3, 0) + self.labelPause = QLabel(self) + layout.addWidget(self.labelPause, 3, 1) + self.taskProgress.pausedChanged.connect(lambda v: self.labelPause.setText(str(v))) + + layout.addWidget(QLabel('停止信号 :', self), 4, 0) + self.labelStop = QLabel(self) + layout.addWidget(self.labelStop, 4, 1) + self.taskProgress.stoppedChanged.connect(lambda v: self.labelStop.setText(str(v))) + + layout.addWidget(QLabel('值改变信号:', self), 5, 0) + self.labelValue = QLabel(self) + layout.addWidget(self.labelValue, 5, 1) + self.taskProgress.valueChanged.connect(lambda v: self.labelValue.setText(str(v))) + + layout.addWidget(QLabel('可见度信号:', self), 6, 0) + self.labelVisible = QLabel(self) + layout.addWidget(self.labelVisible, 6, 1) + self.taskProgress.visibilityChanged.connect(lambda v: self.labelVisible.setText(str(v))) + + def set_range(self): + # 设置进度条范围值 + vmin = min(self.spinBoxMin.value(), self.spinBoxMax.value()) + vmax = max(self.spinBoxMin.value(), self.spinBoxMax.value()) + self.taskProgress.setRange(vmin, vmax) + + def set_current_value(self): + # 设置进度条当前值 + self.taskProgress.setValue(self.spinBoxCur.value()) + + def set_show_hide(self): + # 显示/隐藏 + visible = self.taskProgress.isVisible() + # 也可以使用self.taskProgress.setVisible + if visible: + self.taskProgress.hide() + self.sender().setText('显示') + else: + self.taskProgress.show() + self.sender().setText('隐藏') + + def set_pause_resume(self): + # 暂停/恢复 + paused = self.taskProgress.isPaused() + # 也可以使用self.taskProgress.setPaused + if paused: + self.taskProgress.resume() + self.timerProgress.start(100) + self.sender().setText('暂停') + else: + self.taskProgress.pause() + self.timerProgress.stop() + self.sender().setText('恢复') + + def set_reset(self): + # 重置 + self.taskProgress.reset() + paused = self.taskProgress.isPaused() + if not paused: + self.timerProgress.stop() + self.timerProgress.start(100) + + def set_stop(self): + # 停止 + self.timerProgress.stop() + self.taskProgress.stop() + self.setEnabled(False) + + def set_visible(self): + # 可见/不可见 + visible = self.taskProgress.isVisible() + self.taskProgress.setVisible(not visible) + self.sender().setText('可见' if visible else '不可见') + + def start_progress(self): + # 模拟进度 + self.timerProgress.start(100) + self.sender().setEnabled(False) + + def update_progress(self): + value = self.taskProgress.value() + value += 1 + if value > self.taskProgress.maximum(): + value = 0 + self.taskProgress.setValue(value) + + +if __name__ == '__main__': + cgitb.enable(1, None, 5, '') + app = QApplication(sys.argv) + w = Window() + w.show() + sys.exit(app.exec_()) diff --git a/README.md b/README.md index 2253d4d..b532756 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,9 @@ https://pyqt.site 论坛是专门针对PyQt5学习和提升开设的网站,分 - [QPainter](QPainter) +- [QtWinExtras](QtWinExtras) + - [任务栏进度条](QtWinExtras/TaskbarProgress) + - Others - [QFont](QFont) - [加载自定义字体](QFont/AwesomeFont.py)