PyQt5系列教程(17):跑馬燈(進度條的使用)
上期我們學習了如何使用滑塊(QSlider),本期我們介紹一下進度條的使用(QProgressBar)。還記得第13章進度對話框的介紹嗎?進度條的長相的確和其類似。
QProgressBar簡介
QProgressBar小部件提供了一個水平或垂直的進度條。
進度條用於向用戶指示操作的進度,並向他們保證應用程序仍在運行。
進度條使用steps的概念。您可以通過指定最小和最大可能的step值來設置它,並且當您稍後將當前step值賦給它時,它將顯示已經完成的step的百分比。百分比是通過將進度 (value() - minimum()) / (maximum() - minimum())來計算的。
您可以使用setMinimum()和setMaximum()指定最小和最大steps。默認值是0和99。當前的step由setValue()設置。進度條可以通過reset()重新開始。
如果最小值和最大值都設置為0,那麼欄會顯示一個繁忙的指示符,而不是步驟的百分比。例如,在使用QNetworkAccessManager下載項目時,這是非常有用的,因為他們無法確定正在下載的項目的大小。
詳見官網介紹:QProgressBar Class
QProgressBar小例子
今天的小例子的完成效果如下:
可能會有卡頓的情況,請大家忽視這個細節,主要是因為在虛擬機錄製,而宿主機配置較低,所以就那樣了,實際運行還是很流暢的。
from PyQt5.QtWidgets import QWidget, QApplication, QProgressBar, QPushButton, QMessageBoxfrom PyQt5.QtCore import Qt, QBasicTimerimport sysclass Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(600,480) self.setWindowTitle(關注微信公眾號:學點編程吧--跑馬燈(進度條)) self.pb11 = QProgressBar(self) #self.pb12、self.pb13、self.pb14、self.pb21、self.pb22都這樣創建的 #代碼省略... self.pb11.setOrientation(Qt.Horizontal) self.pb12.setOrientation(Qt.Vertical) self.pb13.setOrientation(Qt.Horizontal) self.pb14.setOrientation(Qt.Vertical) #布局的代碼省略... self.pb21.setFormat("%v") self.pb22.setInvertedAppearance(True) self.b1 = QPushButton(外圈跑馬燈,self) self.b2 = QPushButton(內圈跑進度,self) self.show() self.timer = QBasicTimer() self.step = 0 self.b1.clicked.connect(self.running) self.b2.clicked.connect(self.doaction) def timerEvent(self, e): if self.step >= 100: self.timer.stop() QMessageBox.information(self,提示,內圈收工了!) self.b2.setText(再來一次) self.step = 0 return self.step = self.step + 1 self.pb21.setValue(self.step) self.pb22.setValue(self.step) def doaction(self): if self.timer.isActive(): self.timer.stop() self.b2.setText(繼續) else: self.timer.start(100, self) self.b2.setText(停止) def running(self): self.pb11.setMinimum(0) self.pb11.setMaximum(0) self.pb12.setInvertedAppearance(True) self.pb12.setMinimum(0) self.pb12.setMaximum(0) self.pb13.setInvertedAppearance(True) self.pb13.setMinimum(0) self.pb13.setMaximum(0) self.pb14.setMinimum(0) self.pb14.setMaximum(0) if __name__ == __main__: #常規代碼省略...
這個例子當中我們做了一個跑馬燈,其實就是看起來像。然後中間再做了一個正常點的進度條。
self.pb11.setOrientation(Qt.Horizontal)self.pb12.setOrientation(Qt.Vertical)self.pb13.setOrientation(Qt.Horizontal)self.pb14.setOrientation(Qt.Vertical)
進度條是可以設置方向的,你可以選擇垂直或是水平。這裡我們通過垂直和水平方式建立了一個跑馬圈。
QProgressBar.setOrientation()該屬性設置了進度條的方向,方向必須是Qt.Horizontal(默認,水平)或Qt.Vertical(垂直)。
self.pb21.setFormat("%v")
不知道大家仔細看沒有,圈內的進度條上面的指示數字是不一樣的,例如:
QProgressBar.setFormat()屬性包含用於生成當前文本的字元串
- %p - 被完成的百分比取代
- %v - 被當前值替換
- %m - 被總step所取代
- 默認值是」%p%」
self.pb22.setInvertedAppearance(True)
我們知道進度條可以向左向右前進(以水平進度條為例),這個就是通過QProgressBar.setInvertedAppearance()來設置的。如果這個屬性為真,則進度條向另一個方向增長(例如從右向左)。 默認情況下,進度條從左到右(水平進度條)。
self.timer = QBasicTimer()
要激活進度條,我們使用一個計時器對象。
QBasicTimer簡介
QBasicTimer類為對象提供計時器事件。
這是Qt內部使用的一個快速,輕量級和低級別的類。注意這個定時器是一個重複的定時器,除非調用stop()函數,否則它將發送後續的定時器事件。當定時器超時時,它將向QObject子類發送一個timer事件。定時器可以隨時stop()。
self.timer.start(100, self)
要啟動計時器事件,我們調用它的start()方法。 這個方法有兩個參數:超時時間(毫秒級)和接收事件的對象。
def timerEvent(self, e): if self.step >= 100: self.timer.stop() QMessageBox.information(self,提示,內圈收工了!) self.b2.setText(再來一次) self.step = 0 return self.step = self.step + 1 self.pb21.setValue(self.step) self.pb22.setValue(self.step)
每個QObject及其子類都有一個timerEvent()事件處理程序。 為了對計時器事件作出反應,我們重新實現事件處理程序。
- 總step<100的話,就自加,從圖形上看就是進度條再前進。
- 總step>100的話,定時器停止,setp重置為0。
QProgressBar.setValue()該屬性設置進度條的當前值,value值不停地增加,進度就在增加。
def doaction(self): if self.timer.isActive(): self.timer.stop() self.b2.setText(繼續) else: self.timer.start(100, self) self.b2.setText(停止)
在doaction()方法內部,我們啟動和停止定時器。isActive()如果定時器正在運行且尚未停止,則返回True;否則返回False。
因為最開始定時器是沒有運行, 所以會執行self.timer.start(100,self)語句;當再次按下按鈕時候,定時器已經運行,所以會執行self.timer.stop()語句,將定時器停止。自然也不會去執行timerEvent()中的內容了。
def running(self): self.pb11.setMinimum(0) self.pb11.setMaximum(0) ...
就像之前講的那樣,如果最小值和最大值都設置為0,那麼欄會顯示一個繁忙的指示符,而不是步驟的百分比。所以就模擬成了跑馬燈。
ok,今天進度條的介紹暫時就到這裡吧。下期我們再約。
如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送pyqt517,會自動得到相應的百度網盤下載鏈接。
推薦閱讀:
※PyQt5系列教程(7):界面搭建
※Qt桌面開發的困惑?
※PyQt4教程的對話框(QInputDialog)例子里的一段代碼,為什麼要這樣寫?
※有哪些顏值高的 PyQt/Qt 應用?
※cmd打命令的時候,有時參數是個很長的路徑,輸入非常麻煩,怎樣解決?