
知識點(diǎn):
1、進(jìn)度條
#將進(jìn)度條的最大值、最小值設置為相同時(shí),產(chǎn)生跑馬燈效果self.progressBar.setMinimum(0)self.progressBar.setMaximum(0)
一些關(guān)于進(jìn)度條的補充知識點(diǎn):


Qt提供了兩種顯示進(jìn)度條的方式,一種是QProgressBar,另一種是QProgressDialog,QProgressBar類(lèi)提供了種橫向或縱向顯示進(jìn)度條的控件表示方式,用來(lái)描述任務(wù)的完成情況。QProgressDialog類(lèi)提供了一種針對慢速過(guò)程的進(jìn)度對話(huà)框表示方式,用于描述任務(wù)完成的進(jìn)度情況。標準的進(jìn)度條對話(huà)框包括一個(gè)進(jìn)度顯示條,一個(gè)取消按鈕以及一個(gè)標簽。QProgressBar有幾個(gè)重要的屬性值,minimum,maximum決定進(jìn)度條提示的最小值和最大值,format決定進(jìn)度條顯示文字的格式,可以有3種顯示格式:%p%,%v,%m。%p%顯示完成的百分比,這是默認顯示方式;%v顯示當前的進(jìn)度值;%m顯示總的步進(jìn)值。invertedAppearance屬性可以讓進(jìn)度條以反方向顯示進(jìn)度。QProgressDialog也有幾個(gè)重要的屬性值,決定了進(jìn)度條對話(huà)框何時(shí)出現,出現多長(cháng)時(shí)間,分別是minimum,maximum和minimumDuration。minimum和maximum分別表示進(jìn)度條的最小值和最大值,決定了進(jìn)度條的變化范圍,minimumDuration為進(jìn)度條對話(huà)框出現前的等待時(shí)間。系統根據所需完成的工作量估算一個(gè)預計花費的時(shí)間,若大于設定的等待時(shí)間minimumDuration,則出現進(jìn)度條對話(huà)框;若小于設定的等待時(shí)間,則不出現進(jìn)度條對話(huà)框。進(jìn)度條使用了一個(gè)步進(jìn)值的概念,即一時(shí)設置好進(jìn)度條的最大值和最小值,進(jìn)度條將會(huì )顯示完成的步進(jìn)值占總的步進(jìn)值的百分比,百分比的計算公式為:百分比=(value()-minimum())/(maximum()-minimum())

本例具體實(shí)現代碼如下:


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("使用進(jìn)度條")) 12 numLabel=QLabel(self.tr("文件數目")) 13 self.numLineEdit=QLineEdit("10") 14 typeLabel=QLabel(self.tr("顯示類(lèi)型")) 15 self.typeComboBox=QComboBox() 16 self.typeComboBox.addItem(self.tr("進(jìn)度條")) 17 self.typeComboBox.addItem(self.tr("進(jìn)度對話(huà)框")) 18 19 self.progressBar=QProgressBar() 20 21 startPushButton=QPushButton(self.tr("開(kāi)始")) 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行獲得當前需要復制的文件數目,這里對應進(jìn)度條的總的步進(jìn)值。第40-46行采用進(jìn)度條的方式顯示進(jìn)度。第41,42行設置進(jìn)度條的步進(jìn)范圍從0到需要復制的文件數目。第45,46行模擬每一個(gè)文件的復制過(guò)程,這里通過(guò)QThread.msleep(100)來(lái)模擬,在實(shí)際中使用文件復制過(guò)程來(lái)替換,進(jìn)度條的總的步進(jìn)值為需要復制的文件數目,當復制完成一個(gè)文件后,步進(jìn)值增加1。第48-61行采用進(jìn)度對話(huà)框的方式顯示進(jìn)度。第49行創(chuàng )建一個(gè)進(jìn)度對話(huà)框。第50行設置進(jìn)度對話(huà)框采用模態(tài)方式進(jìn)行顯示,即顯示進(jìn)度的同時(shí),其他窗口將不響應輸入信號。第51 行設置進(jìn)度對話(huà)框出現等待時(shí)間,此處設定為5秒,默認為4秒。第52-54行設置進(jìn)度對話(huà)框的窗體標題,顯示文字信息以及取消按鈕的顯示文字。第55行設置進(jìn)度對話(huà)框的步進(jìn)范圍。第57-61行模擬每一個(gè)文件復制過(guò)程,這里通過(guò)QThread.msleep(100)進(jìn)行模擬,在實(shí)際中使用文件復制過(guò)程來(lái)替換,進(jìn)度條的總的步進(jìn)值為需要復制的文件數目,當復制完一個(gè)文件后,步進(jìn)值增加1,這里需要使用processEvents()來(lái)正常響應事件循環(huán),以確保應用程序不會(huì )出現阻塞。第60,61行檢測“取消”按鈕是否被觸發(fā),若觸發(fā)則退出循環(huán)并關(guān)閉進(jìn)度對話(huà)框,在實(shí)際應用中,此處還需進(jìn)行相關(guān)的清理工作。進(jìn)度對話(huà)框的使用有兩種方法,即模態(tài)方式與非模態(tài)方式。本實(shí)例中使用的是模態(tài)方式,模態(tài)方式的使用比較簡(jiǎn)單方便,但必須使用processEvents來(lái)使事件循環(huán)保持正常進(jìn)行狀態(tài),從而確保應用不會(huì )阻塞。若使用非模態(tài)方式,則需要通過(guò)QTime來(lái)實(shí)現定時(shí)設置進(jìn)度條的值。




# -*- coding: utf-8 -*-from PyQt5.QtCore import pyqtSlot, QBasicTimer,Qtfrom PyQt5.QtWidgets import QDialog,QSplashScreenfrom Ui_processbar1 import Ui_windows2class windows2(QDialog, Ui_windows2): def __init__(self, parent=None): super(windows2, self).__init__(parent) self.setupUi(self) # 創(chuàng )建一個(gè)定時(shí)器對象,默認開(kāi)始為0 self.timer = QBasicTimer() self.step = 0 @pyqtSlot() def on_pushButton_clicked(self): if self.timer.isActive(): self.timer.stop() self.pushButton.setText('開(kāi)始') 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 插入啟動(dòng)頁(yè)背景圖 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) # 設置進(jìn)程,啟動(dòng)加載頁(yè)面時(shí)可以進(jìn)行其他操作而不會(huì )卡死 app.processEvents() ui = windows2() ui.show() # 結束啟動(dòng)頁(yè) splash.finish(ui) sys.exit(app.exec_())

聯(lián)系客服