1. 程式人生 > >【PyQt5-Qt Designer】QProgressBar() 進度條

【PyQt5-Qt Designer】QProgressBar() 進度條

毫秒 代碼 提示框 重新 mat 案例 turn 概念 exit

QProgressBar() 進度條

QProgressBar簡介

QProgressBar小部件提供了一個水平或垂直的進度條。

進度條用於向用戶指示操作的進度,並向他們保證應用程序仍在運行。

進度條使用steps的概念。您可以通過指定最小和最大可能的step值來設置它,並且當您稍後將當前step值賦給它時,它將顯示已經完成的step的百分比。百分比是通過將進度 (value() - minimum()) / (maximum() - minimum())來計算的。

您可以使用setMinimum()和setMaximum()指定最小和最大steps。默認值是0和99。當前的step由setValue()設置。進度條可以通過reset()重新開始。

如果最小值和最大值都設置為0,那麽欄會顯示一個繁忙的指示符,而不是步驟的百分比。例如,在使用QNetworkAccessManager下載項目時,這是非常有用的,因為他們無法確定正在下載的項目的大小。

詳見官網介紹:QProgressBar Class

QProgressBar小例子

今天的小例子的完成效果如下:

技術分享圖片

可能會有卡頓的情況,請大家忽視這個細節,主要是因為在虛擬機錄制,而宿主機配置較低,所以就那樣了,實際運行還是很流暢的。

效果如下:

技術分享圖片

參考:

https://zhuanlan.zhihu.com/p/31109561

完整代碼:

技術分享圖片
 1 from PyQt5.QtWidgets import
(QApplication,QWidget,QMessageBox,QGridLayout,QPushButton,QProgressBar) 2 from PyQt5.QtCore import Qt,QBasicTimer 3 from PyQt5.QtGui import QPixmap 4 import sys 5 6 class Example(QWidget): 7 def __init__(self): 8 super(Example, self).__init__() 9 self.initUI() 10 11 def
initUI(self): 12 self.setGeometry(300,300,400,400) 13 self.setWindowTitle("QProgressBar進度條") 14 gridLayout = QGridLayout() 15 self.btn1 = QPushButton("外圈跑馬燈") 16 self.btn2 = QPushButton("內圈跑馬燈") 17 self.pb11 = QProgressBar() 18 self.pb12 = QProgressBar() 19 self.pb13 = QProgressBar() 20 self.pb14 = QProgressBar() 21 self.pb21 = QProgressBar() 22 self.pb22 = QProgressBar() 23 self.pb11.setOrientation(Qt.Vertical) 24 self.pb12.setOrientation(Qt.Horizontal) 25 self.pb13.setOrientation(Qt.Vertical) 26 self.pb14.setOrientation(Qt.Horizontal) 27 self.pb21.setOrientation(Qt.Horizontal) 28 self.pb22.setOrientation(Qt.Horizontal) 29 gridLayout.addWidget(self.pb11,0,0,6,1) 30 gridLayout.addWidget(self.pb12,0,1,1,6) 31 gridLayout.addWidget(self.pb13,0,6,6,1) 32 gridLayout.addWidget(self.pb14,5,1,1,6) 33 gridLayout.addWidget(self.pb21,1,2,1,4) 34 gridLayout.addWidget(self.btn1,2,3,1,1) 35 gridLayout.addWidget(self.btn2,3,3,1,1) 36 gridLayout.addWidget(self.pb22,4,2,1,4) 37 self.setLayout(gridLayout) 38 39 self.timer = QBasicTimer() 40 self.step = 0 41 self.pb21.setFormat("%v") 42 self.pb22.setInvertedAppearance(True) 43 self.btn1.clicked.connect(self.running) 44 self.btn2.clicked.connect(self.doAction) 45 46 def running(self): 47 self.pb11.setMinimum(0) 48 self.pb11.setMaximum(0) 49 self.pb12.setMinimum(0) 50 self.pb12.setMaximum(0) 51 self.pb13.setMinimum(0) 52 self.pb13.setMaximum(0) 53 self.pb13.setInvertedAppearance(True) 54 self.pb14.setMinimum(0) 55 self.pb14.setMaximum(0) 56 self.pb14.setInvertedAppearance(True) 57 58 def timerEvent(self, e): 59 if self.step >= 100: 60 self.timer.stop() 61 QMessageBox.information(self,"信息提示框","內圈進度收工了!") 62 self.btn2.setText("再來一次吧!") 63 self.step = 0 64 return 65 self.step = self.step + 1 66 self.pb21.setValue(self.step) 67 self.pb22.setValue(self.step) 68 69 def doAction(self): 70 if self.timer.isActive(): 71 self.timer.stop() 72 self.btn2.setText("繼續") 73 else: 74 self.timer.start(100,self) 75 self.btn2.setText("停止") 76 77 if __name__ == __main__: 78 app = QApplication(sys.argv) 79 ex = Example() 80 ex.show() 81 sys.exit(app.exec_())
QProgressBar進度條案例

這個例子當中我們做了一個跑馬燈,其實就是看起來像。然後中間再做了一個正常點的進度條。

selfs .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,那麽欄會顯示一個繁忙的指示符,而不是步驟的百分比。所以就模擬成了跑馬燈。

【PyQt5-Qt Designer】QProgressBar() 進度條