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打命令的時候,有時參數是個很長的路徑,輸入非常麻煩,怎樣解決?

TAG:Python | Python教程 | PyQt |