分享

【PyQt5

 lucifer76 2020-03-24

QProgressBar 进度条+QSplashScreen 启动界面

 

知识点:

1、进度条

#将进度条的最大值、最小值设置为相同时,产生跑马灯效果
self.progressBar.setMinimum(0)
self.progressBar.setMaximum(0)

一些关于进度条的补充知识点:

复制代码
Qt提供了两种显示进度条的方式,一种是QProgressBar,另一种是QProgressDialog,QProgressBar类提供了种横向或纵向显示进度条的控件表示方式,用来描述任务的完成情况。QProgressDialog类提供了一种针对慢速过程的进度对话框表示方式,用于描述任务完成的进度情况。标准的进度条对话框包括一个进度显示条,一个取消按钮以及一个标签。

QProgressBar有几个重要的属性值,minimum,maximum决定进度条提示的最小值和最大值,format决定进度条显示文字的格式,可以有3种显示格式:%p%,%v,%m。%p%显示完成的百分比,这是默认显示方式;%v显示当前的进度值;%m显示总的步进值。invertedAppearance属性可以让进度条以反方向显示进度。

QProgressDialog也有几个重要的属性值,决定了进度条对话框何时出现,出现多长时间,分别是minimum,maximum和minimumDuration。minimum和maximum分别表示进度条的最小值和最大值,决定了进度条的变化范围,minimumDuration为进度条对话框出现前的等待时间。系统根据所需完成的工作量估算一个预计花费的时间,若大于设定的等待时间minimumDuration,则出现进度条对话框;若小于设定的等待时间,则不出现进度条对话框。

进度条使用了一个步进值的概念,即一时设置好进度条的最大值和最小值,进度条将会显示完成的步进值占总的步进值的百分比,百分比的计算公式为:

百分比=(value()-minimum())/(maximum()-minimum())
复制代码

本例具体实现代码如下:

复制代码
 1 # -*- coding: utf-8 -*-   
 2 from PyQt4.QtGui import *  
 3 from PyQt4.QtCore import *  
 4 import sys  
 5   
 6 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))  
 7    
 8 class Progess(QDialog):  
 9     def __init__(self,parent=None):  
10         super(Progess,self).__init__(parent)  
11         self.setWindowTitle(self.tr("使用进度条"))  
12         numLabel=QLabel(self.tr("文件数目"))  
13         self.numLineEdit=QLineEdit("10")  
14         typeLabel=QLabel(self.tr("显示类型"))  
15         self.typeComboBox=QComboBox()  
16         self.typeComboBox.addItem(self.tr("进度条"))  
17         self.typeComboBox.addItem(self.tr("进度对话框"))  
18   
19         self.progressBar=QProgressBar()  
20   
21         startPushButton=QPushButton(self.tr("开始"))  
22   
23         layout=QGridLayout()  
24         layout.addWidget(numLabel,0,0)  
25         layout.addWidget(self.numLineEdit,0,1)  
26         layout.addWidget(typeLabel,1,0)  
27         layout.addWidget(self.typeComboBox,1,1)  
28         layout.addWidget(self.progressBar,2,0,1,2)  
29         layout.addWidget(startPushButton,3,1)  
30         layout.setMargin(15)  
31         layout.setSpacing(10)  
32   
33         self.setLayout(layout)  
34           
35         self.connect(startPushButton,SIGNAL("clicked()"),self.slotStart)  
36   
37     def slotStart(self):  
38         num=int(self.numLineEdit.text())  
39   
40         if self.typeComboBox.currentIndex()==0:  
41             self.progressBar.setMinimum(0)  
42             self.progressBar.setMaximum(num)  
43   
44             for i in range(num):  
45                 self.progressBar.setValue(i)  
46                 QThread.msleep(100)  
47   
48         elif self.typeComboBox.currentIndex()==1:  
49             progressDialog=QProgressDialog(self)  
50             progressDialog.setWindowModality(Qt.WindowModal)  
51             progressDialog.setMinimumDuration(5)  
52             progressDialog.setWindowTitle(self.tr("请等待"))  
53             progressDialog.setLabelText(self.tr("拷贝..."))  
54             progressDialog.setCancelButtonText(self.tr("取消"))  
55             progressDialog.setRange(0,num)  
56   
57             for i in range(num):  
58                 progressDialog.setValue(i)  
59                 QThread.msleep(100)  
60                 if progressDialog.wasCanceled():  
61                     return  
62                   
63 app=QApplication(sys.argv)  
64 progess=Progess()  
65 progess.show()  
66 app.exec_()  
复制代码

案例解析:

复制代码
第38行获得当前需要复制的文件数目,这里对应进度条的总的步进值。

第40-46行采用进度条的方式显示进度。

第41,42行设置进度条的步进范围从0到需要复制的文件数目。

第45,46行模拟每一个文件的复制过程,这里通过QThread.msleep(100)来模拟,在实际中使用文件复制过程来替换,进度条的总的步进值为需要复制的文件数目,当复制完成一个文件后,步进值增加1。

第48-61行采用进度对话框的方式显示进度。

第49行创建一个进度对话框。

第50行设置进度对话框采用模态方式进行显示,即显示进度的同时,其他窗口将不响应输入信号。

第51 行设置进度对话框出现等待时间,此处设定为5秒,默认为4秒。

第52-54行设置进度对话框的窗体标题,显示文字信息以及取消按钮的显示文字。

第55行设置进度对话框的步进范围。

第57-61行模拟每一个文件复制过程,这里通过QThread.msleep(100)进行模拟,在实际中使用文件复制过程来替换,进度条的总的步进值为需要复制的文件数目,当复制完一个文件后,步进值增加1,这里需要使用processEvents()来正常响应事件循环,以确保应用程序不会出现阻塞。

第60,61行检测“取消”按钮是否被触发,若触发则退出循环并关闭进度对话框,在实际应用中,此处还需进行相关的清理工作。

进度对话框的使用有两种方法,即模态方式与非模态方式。本实例中使用的是模态方式,模态方式的使用比较简单方便,但必须使用processEvents来使事件循环保持正常进行状态,从而确保应用不会阻塞。若使用非模态方式,则需要通过QTime来实现定时设置进度条的值。
复制代码

 

 

UI文件

 

复制代码
# -*- coding: utf-8 -*-
from PyQt5.QtCore import pyqtSlot, QBasicTimer,Qt
from PyQt5.QtWidgets import QDialog,QSplashScreen
from Ui_processbar1 import Ui_windows2

class windows2(QDialog, Ui_windows2):

    def __init__(self, parent=None):
        super(windows2, self).__init__(parent)
        self.setupUi(self)
        # 创建一个定时器对象,默认开始为0
        self.timer = QBasicTimer()
        self.step = 0

    @pyqtSlot()
    def on_pushButton_clicked(self):
        if self.timer.isActive(): 
            self.timer.stop()
            self.pushButton.setText('开始')
        else:
            self.timer.start(100, self)
            self.pushButton.setText('暂停')

    def timerEvent(self, event):
        if self.step >= 100:
            self.timer.stop()
            return
        self.step = self.step + 1
        self.progressBar.setValue(self.step)

    @pyqtSlot()
    def on_pushButton_2_clicked(self):
        self.timer.stop()
        self.progressBar.setValue(0)
    
    @pyqtSlot()
    def on_pushButton_3_clicked(self):
        for i in range(100):
            self.progressBar_2.setValue(i)
            time.sleep(0.1)

    @pyqtSlot()
    def on_pushButton_4_clicked(self):
        self.progressBar_2.setValue(0)

    @pyqtSlot()
    def on_pushButton_5_clicked(self):
        self.progressBar_5.setMaximum(0)
        self.progressBar_7.setMaximum(0)
        self.progressBar_4.setMaximum(0)
        self.progressBar_6.setMaximum(0)

    @pyqtSlot()
    def on_pushButton_6_clicked(self):
        self.progressBar_4.setMaximum(1)
        self.progressBar_5.setMaximum(1)
        self.progressBar_6.setMaximum(1)
        self.progressBar_7.setMaximum(1)


if __name__ == "__main__":
    import sys, time,PyQt5
    app = PyQt5.QtWidgets.QApplication(sys.argv)
    #定义QSplashScreen 插入启动页背景图
    splash = QSplashScreen(PyQt5.QtGui.QPixmap("splash.jpg"))
    splash.show()
    #定义字体格式
    font = PyQt5.QtGui.QFont()
    font.setPointSize(16)
    font.setBold(True)
    font.setWeight(75)
    splash.setFont(font)
    splash.showMessage("正在加载。。。",Qt.AlignCenter,Qt.red,)
    time.sleep(1)
    splash.showMessage("渲染图片。。。", Qt.AlignCenter, Qt.red)
    time.sleep(1)
    # 设置进程,启动加载页面时可以进行其他操作而不会卡死
    app.processEvents()
    ui = windows2()
    ui.show()
    # 结束启动页
    splash.finish(ui)
    sys.exit(app.exec_())
复制代码

 

 

 

补充知识点:

dir(PyQt5.QtCore))    #返回PyQt5.QtCore 的所有方法,是列表类型

help(PyQt5.QtCore.QTime)    #使用help()方法查看PyQt5.QtCore.QTime 如何使用

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多