zoukankan      html  css  js  c++  java
  • 【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,那么栏会显示一个繁忙的指示符,而不是步骤的百分比。所以就模拟成了跑马灯。

  • 相关阅读:
    获取指定位置的颜色值
    《QTP自动化测试进阶》读书笔记
    Delphi自动化测试
    QTP中DOM的递归调用取html页面值
    PowerShell
    Dictionary对象与XML文件之间的导入导出
    BPT业务流程自动化测试
    VisualStudio 自动化测试框架 Coded UI Test
    使用QTP查找邮件
    QTP11视频
  • 原文地址:https://www.cnblogs.com/XJT2018/p/10218299.html
Copyright © 2011-2022 走看看