PyQt5是一个提供给Python程序员使用的GUI工具包,它通过对Qt库的封装,为Python程序员提供了丰富的功能和易于使用的API。其中,QProgressBar控件提供了一个用于显示进度的水平或垂直进度条。orientation()方法是设置或获取进度条控件的方向。这里我们给出orientation()方法的使用攻略。
orientation()方法的介绍
QProgressBar.orientation() -> Qt.Orientation
该方法返回进度条的方向(Qt.Horizontal水平方向或Qt.Vertical垂直方向),默认水平方向。
QProgressBar.setOrientation(Qt.Orientation)
该方法设置进度条的方向。
orientation()方法的使用方法
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QHBoxLayout
from PyQt5.QtCore import Qt
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
hbox = QHBoxLayout()
self.progressbar = QProgressBar(self)
hbox.addWidget(self.progressbar)
self.setLayout(hbox)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('QProgressBar')
def setHorizontal(self):
self.progressbar.setRange(0, 100)
self.progressbar.setValue(20)
def setVertical(self):
self.progressbar.setOrientation(Qt.Vertical)
self.progressbar.setRange(0, 100)
self.progressbar.setValue(20)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
ex.setHorizontal()
ex.setVertical()
sys.exit(app.exec_())
上述代码演示了如何创建和设置QProgressBar控件。在该例子中,我们模拟了进度条的两种方向:水平方向和垂直方向。
首先,我们通过QHBoxLayout布局将QProgressBar控件添加到QWidget窗口中。然后,我们定义了一个QPushButton按钮并将其与两个不同的槽连接,用于模拟两种方向。在setHorizontal()槽中,我们设置了进度条的范围和值,以及进度条的方向为默认的水平方向。在setVertical()槽中,我们使用setOrientation设置了进度条的方向为垂直方向。
当程序启动时,我们会看到水平方向的进度条,然后通过按钮切换为垂直方向。
示例一
下面是一个进度条显示文件上传百分比的示例:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QPushButton, QVBoxLayout
from PyQt5.QtCore import Qt, QBasicTimer
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
vbox = QVBoxLayout()
self.progressbar = QProgressBar(self)
vbox.addWidget(self.progressbar)
self.btn = QPushButton('Start', self)
vbox.addWidget(self.btn)
self.setLayout(vbox)
self.timer = QBasicTimer() # 定时器
self.step = 0
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('QProgressBar')
self.btn.clicked.connect(self.doAction)
def timerEvent(self, e):
if self.step >= 100:
self.timer.stop()
self.btn.setText('Finished')
return
self.step = self.step + 1
self.progressbar.setValue(self.step)
def doAction(self):
if self.timer.isActive():
self.timer.stop()
self.btn.setText('Start')
else:
self.timer.start(100, self)
self.btn.setText('Stop')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
在这个例子中,我们通过单击按钮开始上传文件后会模拟文件上传的过程,使用进度条来显示上传进度。在setRange()方法中,我们设置进度条的最小值为0,最大值为100。在start()方法中,我们将时间间隔设置为100毫秒并关联到我们的计时器。计时器事件会在时间间隔达到时触发,在每次触发时会更新进度条的值,如果上传完成,则停止计时器。
示例二
下面是一个进度条显示下载文件百分比的示例:
import sys
import requests
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar, QPushButton, QVBoxLayout
from PyQt5.QtCore import Qt, QBasicTimer, QThread, pyqtSignal
class DownloadThread(QThread):
# 自定义一个信号,返回两个参数:1. 文件大小 2. 已下载文件大小
downloadProgress = pyqtSignal(int, int)
def __init__(self, url):
super().__init__()
self.url = url
def run(self):
response = requests.get(self.url, stream=True)
total_size = int(response.headers.get('content-length', 0)) # 获取下载文件总大小
bytes_so_far = 0 # 已经下载文件大小
for chunk in response.iter_content(2048):
bytes_so_far += len(chunk)
self.downloadProgress.emit(total_size, bytes_so_far) # 触发 downloadProgress 信号
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
vbox = QVBoxLayout()
self.progressbar = QProgressBar(self)
vbox.addWidget(self.progressbar)
self.btn = QPushButton('Start', self)
vbox.addWidget(self.btn)
self.setLayout(vbox)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('QProgressBar')
self.thread = None
self.btn.clicked.connect(self.doAction)
def downloadProgress(self, total, current):
self.progressbar.setMaximum(total)
self.progressbar.setValue(current)
def startDownload(self, url):
self.thread = DownloadThread(url)
self.thread.downloadProgress.connect(self.downloadProgress) # 将自定义信号连接到槽函数
self.thread.start()
def stopDownload(self):
if self.thread:
self.thread.terminate()
def doAction(self):
if self.btn.text() == 'Start':
url = 'https://download.qiuzhi99.com/Qiuzhi99.apk'
self.startDownload(url)
self.btn.setText('Stop')
else:
self.stopDownload()
self.btn.setText('Start')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
在这个例子中,我们使用DownloadThread(QThread)在后台执行下载任务。当下载任务执行时,会触发downloadProgress信号,从而使进度条能够更新。在下载任务被停止时,我们使用terminate()方法停止线程。
在downloadProgress()槽中,我们通过setMaximum()方法设置进度条的最大值为文件的总大小,通过setValue()方法更新进度条的值。
通过点击按钮,可以开始或停止进度条的更新。