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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM