下面我将为您介绍Python中PyQt5中试管式进度条的完整使用攻略。
1. 安装PyQt5
如果您还没有安装PyQt5,可以通过以下命令在命令行中安装:
pip install PyQt5
2. 导入PyQt5库
在使用PyQt5之前,需要先将PyQt5库导入到您的代码中:
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QVBoxLayout
from PyQt5.QtCore import Qt, QThread, pyqtSignal
其中,QApplication
和QWidget
用于创建Qt应用和窗口,QProgressBar
用作进度条的控件,QVBoxLayout
用于指定进度条的布局方式。Qt
是一个包含Qt中定义的一些核心常量和函数的命名空间。QThread
用于创建一个线程,pyqtSignal
用于在不同的线程之间进行信号通讯。
3. 创建进度条
创建进度条并指定它的方向、最小值和最大值:
progress = QProgressBar()
progress.setOrientation(Qt.Vertical) # 设置进度条为垂直方向
progress.setMinimum(0)
progress.setMaximum(100)
setOrientation
指定进度条的方向为垂直方向,其它常量可以是Qt.Horizontal
表示水平方向。
4. 指定进度条的父控件和布局方式
我们创建一个QWidget用作进度条的父控件,并将其指定为QProgressBar的父控件。使用QVBoxLayout将进度条添加到QWidget中。
app = QApplication([])
window = QWidget()
layout = QVBoxLayout()
layout.addWidget(progress)
window.setLayout(layout)
window.show()
5. 创建一个线程类
class Worker(QThread):
progressValueChanged = pyqtSignal(int)
def run(self):
for i in range(101):
self.progressValueChanged.emit(i)
self.msleep(100)
这个类继承了QThread,并重写了run
方法。在run
方法中,我们通过emit
方法发送一个progressValueChanged
信号,这个信号包含一个整数参数,表示当前进度。
6. 连接信号和槽函数
worker = Worker()
worker.progressValueChanged.connect(progress.setValue)
这里我们创建了一个Worker对象,然后将progressValueChanged
信号连接到progress.setValue
槽函数,每当progressValueChanged
信号被发射时,progress.setValue
槽函数就会被调用,更新进度条的值。
7. 启动线程
worker.start()
这里我们启动了worker
线程,它会在后台循环更新进度条的值,直到进度条达到100。
示例1:利用PyQt5制作简易进度条
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QVBoxLayout
from PyQt5.QtCore import Qt, QThread, pyqtSignal
import sys
class Worker(QThread):
progressValueChanged = pyqtSignal(int)
def run(self):
for i in range(101):
self.progressValueChanged.emit(i)
self.msleep(100)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()
progress = QProgressBar()
progress.setOrientation(Qt.Vertical)
progress.setMinimum(0)
progress.setMaximum(100)
layout.addWidget(progress)
window.setLayout(layout)
window.show()
worker = Worker()
worker.progressValueChanged.connect(progress.setValue)
worker.start()
sys.exit(app.exec_())
运行这个例子,可以看到一个简单的垂直方向的进度条在后台更新。
示例2:为进度条添加自定义样式
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QVBoxLayout
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QPixmap, QPainter, QColor
import sys
class Worker(QThread):
progressValueChanged = pyqtSignal(int)
def run(self):
for i in range(101):
self.progressValueChanged.emit(i)
self.msleep(100)
class CustomProgressBar(QProgressBar):
def __init__(self):
super().__init__()
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
# 矩形背景
painter.setPen(Qt.NoPen)
painter.setBrush(QColor(243, 243, 243))
painter.drawRect(0, 0, self.width(), self.height())
# 进度条
value = self.value()
painter.setBrush(QColor(255, 96, 84))
if value > 0:
painter.drawRoundedRect(0, (100 - value) * self.height() / 100, self.width(), self.height() * value / 100, 20, 20)
# 图标
icon = QPixmap('icon.png')
icon_rect = icon.rect()
painter.drawPixmap(self.width() / 2 - icon_rect.width() / 2, self.height() / 2 - icon_rect.height() / 2, icon)
# 文字
font = painter.font()
font.setPointSize(14)
painter.setFont(font)
painter.drawText(0, 0, self.width(), self.height(), Qt.AlignCenter, '{} %'.format(value))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout()
progress = CustomProgressBar()
progress.setMinimum(0)
progress.setMaximum(100)
layout.addWidget(progress)
window.setLayout(layout)
window.show()
worker = Worker()
worker.progressValueChanged.connect(progress.setValue)
worker.start()
sys.exit(app.exec_())
运行这个例子,可以看到一个自定义的垂直方向进度条,可以呈现自己定义的样式。其中,paintEvent
方法用于绘制进度条的背景、进度条、图标和文字。通过继承QProgressBar,我们可以轻松地自定义这个控件的样式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5 – 试管式进度条 - Python技术站