Python Qt GUI与数据可视化编程
上QQ阅读APP看书,第一时间看更新

3.3 QSlider和QProgressBar

在UI Designer的组件面板里还有几个常见的用于输入和输出的组件。在Input Widgets分组里有QSlider和QScrollBar两个滑动型输入组件,在Display Widgets分组里的QProgressBar是进度条显示组件。这三个组件都有orientation属性,可以设置为水平或垂直样式。

使用这三个组件设计的示例Demo3_3运行时界面如图3-4所示。当滑动Slider或ScrollBar的滑块改变值时,都将当前值设置为ProgressBar的值。下面几个复选框和RadioButton按钮用于ProgressBar的显示效果设置。

图3-4 示例Demo3_3运行时界面

该示例是基于widgetApp项目模板的,下面是myWidget.py文件的完整代码:

        import sys
        from PyQt5.QtWidgets import  QApplication, QWidget
        from PyQt5.QtCore import  pyqtSlot


        from ui_Widget import Ui_Widget
        class QmyWidget(QWidget):
            def __init__(self, parent=None):
              super().__init__(parent)    #调用父类构造函数,创建窗体
              self.ui=Ui_Widget()         #创建UI对象
              self.ui.setupUi(self)       #构造UI


              self.ui.slider.setMaximum(200)
              self.ui.scrollBar.setMaximum(200)
              self.ui.progressBar.setMaximum(200)
              self.ui.slider.valueChanged.connect(self.do_valueChanged)
              self.ui.scrollBar.valueChanged.connect(self.do_valueChanged)


        ##  =======由connectSlotsByName() 自动关联的槽函数=================
            def on_radio_Percent_clicked(self):    ##"显示格式--百分比"
              self.ui.progressBar.setFormat("%p%")


            def on_radio_Value_clicked(self):      ##"显示格式--当前值"
              self.ui.progressBar.setFormat("%v")


            @pyqtSlot(bool)    ##"textVisible" 复选框
            def on_chkBox_Visible_clicked(self, checked):
              self.ui.progressBar.setTextVisible(checked)


            @pyqtSlot(bool)    ##"InvertedAppearance"复选框
            def on_chkBox_Inverted_clicked(self, checked):
              self.ui.progressBar.setInvertedAppearance(checked)


        ##  ========自定义槽函数==============================
            def do_valueChanged(self, value):
              self.ui.progressBar.setValue(value)

QSlider和QScrollBar都是从QAbstractSlider类继承来的,拥有一些相同的属性,在属性编辑器里设置后即可看到效果,这些属性如下。

· minimum和maximum:输入范围的最小值和最大值。

· singleStep:单步长,拖动标尺上的滑块,或按下左/右键时的最小变化数值。

· pageStep:输入焦点在组件上时,按PgUp或PgDn键时变化的数值。

· value:组件的当前值,拖动滑块时自动改变此值,并限定在minimum和maximum定义的范围之内。

· sliderPosition:滑块的位置,若tracking属性设置为True, sliderPosition就等于value。

· tracking:sliderPosition是否等同于value,如果tracking设置为True,改变value时也同时改变sliderPosition。

· orientation:Slider或ScrollBar的方向,可以设置为水平或垂直。方向参数是枚举类型Qt.Orientation,其值包括:

♦ Qt.Horizontal(水平方向);

♦ Qt.Vertical(垂直方向)。

· invertedAppearance:显示方式是否反向,若invertedAppearance设置为False,水平的Slider由左向右数值逐渐增大,否则反过来。

· invertedControls:反向按键控制,若invertedControls设置为True,则按下PgUp或PgDn键时调整数值的方向相反。

属于QSlider的专有属性有两个,分别如下。

· tickPosition:标尺刻度的显示位置,使用枚举类型QSlider.TickPosition,其值包括:

♦ QSlider.NoTicks(不显示刻度);

♦ QSlider.TicksBothSides(标尺两侧都显示刻度);

♦ QSlider.TicksAbove(标尺上方显示刻度);

♦ QSlider.TicksBelow(标尺下方显示刻度);

♦ QSlider.TicksLeft(标尺左侧显示刻度);

♦ QSlider.TicksRight(标尺右侧显示刻度)。

· tickInterval:标尺刻度的间隔值,若设置为0,会在singleStep和pageStep之间自动选择。

QSlider和QScrollBar最常用的一个信号是valueChanged(int),在拖动滑块改变当前值时就会发射这个信号。

在QmyWidget类中定义了一个自定义槽函数do_valueChanged(int),这个槽函数的功能是根据传递来的参数value,设置为progressBar的当前值。在构造函数里有两条connect语句,即

        self.ui.slider.valueChanged.connect(self.do_valueChanged)
        self.ui.scrollBar.valueChanged.connect(self.do_valueChanged)

这是将窗体上slider和scrollBar两个组件的valueChanged(int)信号都与这个自定义槽函数关联,因为它们的操作响应是完全一样的。如果还是按照生成自动关联的槽函数的方法,需要为这两个组件分别生成槽函数,但是两个槽函数里的代码是完全一样的。

QProgressBar的父类是QWidget,一般用于进度显示,常用属性有以下几个。

· minimum和maximum:最小值和最大值。

· value:当前值,可以设定或读取当前值。

· textVisible:是否显示文字,文字一般是百分比表示的进度。

· orientation:可以设置为水平或垂直方向。

· format:显示文字的格式,“%p%”显示百分比,“%v”显示当前值,“%m”显示总步数。默认为“%p%”。