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 如何使用
|
|