PyQt5 – orientation() 方法 进度条

  • Post category:Python

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()方法更新进度条的值。

通过点击按钮,可以开始或停止进度条的更新。