Qt5 Python GUI 编程指南
创建时间:2018-12-10  访问量:5292  7  0

Qt5 Python GUI 编程指南

使用滚动条和滑动条

如果要查看不能在有限区域显示的大型文档或图像时,滚动条就非常有用。有水平显示滚动条和垂直显示滚动条,指示文档或图像中的当前位置和不可见区域的大小。使用这些条中提供的滑块句柄,您可以访问文档或图像的隐藏部分。

滑动器是在两个值之间选择整数值的一种方法。也就是说,滑块可以表示值的最小和最大范围,用户可以通过将滑块句柄移动到滑块中所需的位置来选择该范围内的值。

准备

滚动条用于查看大于视图区域的文档或图像。要显示水平或垂直滚动条,可以使用HorizontalScrollBar和VerticalScrollBar部件,它们都是QScrollBar类的实例。这些滚动条有一个滑块,可以通过拖动它来查看不可见的区域。滑块的位置指示文档或图像的显示位置。滚动条有以下控件:

  • Slider handle:这个控件是用来快速移动到文档或图像的任意部分。

  • Scroll arrows:这些是滚动条两边的箭头,用于查看文档或图像中当前不可见的所需区域。在使用这些滚动箭头时,将会移动滑块的位置以显示文档或图像的当前位置。

  • Page control:页面控件是滚动条的背景,可以在其上拖动滑块。当单击滚动条的背景时,滑块向单击的一侧移动一页。滑块的移动量可以通过pageStep属性指定。页面步长是当按下Page Up和Page Down键时,滑块会移动的页面数量。你可以通过setPageStep()方法来设置pageStep属性的数量。

这里描述的value()方法专门用于设置和获取滚动条中的数值。

value()方法获取滑块当前位置的值,即距离滚动条开始位置的数值。当在垂直滚动条中,滑块位于顶部位置时,或者在水平滚动条中,滑块处于最左侧位置时,这时滚动条的值是其最小值,当垂直滚动条中的滑块在最底边,或水平滚动条中的滑块在最右边时,此时滚动条的值为最大值。你也可以通过键盘来移动滑块来将滚动条的值移动到其最小值与最大值之间,例如,可以分别通过Home键和End键来操作滚动条中的滑块。让我们来看下面的一些方法:

  • setValue():这个方法是用来为滚动条赋值的,根据分配的值,在滚动条中设置滑块的位置

  • minimum():这个方法返回滚动条的最小值

  • maximum():这个方法返回滚动条的最大值

  • setMinimum():这个方法用于设置滚动条的最小值

  • setMaximum():这个方法用于设置滚动条的最大值

  • setSingleStep():这个方法用于设置滚动条的步长值

  • setPageStep():这个方法用于设置页面步长值

QScrollBar 仅提供整型数值。

QScrollBar类发出的信号如下所示:

  • valueChanged():当滚动条的值改变时,也就是滑块移动时,触发该事件

  • sliderPressed():当用户开始拖动滑块时,触发该事件

  • sliderMoved():当用户拖动滑块时,触发该事件

  • sliderReleased():当用于释放滑块时,触发该事件

  • actionTriggered():当用户改变此滚动条时,触发该事件

滑动条通常用来表示某个整数值。滚动条主要用于显示大型文档或图像,与滚动条不同的是,滑动条是交互式的,是输入或表示整数值的一种更简单的方式。也就是说,通过沿水平或垂直凹槽移动和定位滑块,可以移动水平或垂直滑动条中的滑块来表示某个整数值。若要显示水平和垂直滑块,则将使用HorizontalSlider和VerticalSlider部件,它们是QSlider类的实例。类似于滚动条中的一些方法,滑动条也会触发这些信号,如valueChanged(),sliderPressed(),sliderMoved(),sliderReleased(),以及更多滑块移动的信息。

滚动条和滑动条中的滑块都表示了在最小值与最大值之间的一个值。为了改变黙认的最小值和最大值,你可以通过改变这些属性来改变黙认值,如minimum,maximum,singleStep和pageStep。

滑动条的属性minimum,maximum,singleStep,pageStep和value的黙认值分别为0,99,1,10和0。

让我们来创建一个应用,包括水平垂直滚动条与水平垂直滑动条。水平滚动条和滑动条分别表示血糖水平和血压。也就是说,在移动水平滚动条时,病人的血糖水平将通过Line Edit部件显示出来。类似地,水平滑动条在移动时将表示血压,并将通过Line Edit显示出来。

垂直滚动条和滑动条分别表示心率和胆固醇水平。在移动垂直滚动条时,心率将通过Line Edit部件显示;在移动垂直滑动条时,胆固醇水平将通过Line Edit部件显示。

如何去做...

要了解水平和垂直滚动条的工作原理,以及水平和垂直滑动条的工作原理,就要了解滚动条和滑动条的值发生变化时如何产生信号,以及各自的槽或方法如何与它们的信号相关联,请执行以下步骤:

  1. 让我们基于Dialog without Buttons模板创建一个应用程序并拖动水平与垂直滚动条与滑动条放在窗体上。

  2. 拖动4个Label部件和一个Line Edit部件来显示滚动条与滑动条的滑块值。

  3. 将这4个Label部件的text属性分别设置为Sugar Level,Blood Pressure,Pulse rate和Cholesterol。

  4. 将水平滚动条的objectName属性设置为horizontalScrollBarSugarLevel,将垂直滚动条的objectName属性设置为verticalScrollBarPulseRate,将水平滑动条的objectName属性设置为horizontalSliderBloodPressure,将垂直滑动条的objectName属性设置为verticalSliderCholestrolLevel。

  5. 将Line Edit部件的objectName属性设置为lineEditorResult。

  6. 将应用程序保存为demoSliders.ui。窗体如下截图所示:

    

    使用pyuic5命令工具将.ui(XML)文件转换成Python代码。生成的Python文件为demoScrollerBar.py,可以在本书源码中看到。

  1. 创建一个名为callScrollBar.py的Python脚本文件并导入demoScrollBar.py,以调用用户界面设计并同步滚动条与滑动条的移动。这个脚本也会将滚动条与滑动条中滑块对应的值显示在一个Label部件中。运行Python脚本callScrollBar.pyw,显示如下所示:

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from demoScrollBar import *
class MyForm(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.horizontalScrollBarSugarLevel.valueChanged.connect
        (self.scrollhorizontal)
        self.ui.verticalScrollBarPulseRate.valueChanged.connect
        (self.scrollvertical)
        self.ui.horizontalSliderBloodPressure.valueChanged.connect
        (self.sliderhorizontal)
        self.ui.verticalSliderCholestrolLevel.valueChanged.connect
        (self.slidervertical)
        self.show()
    def scrollhorizontal(self,value):
        self.ui.lineEditResult.setText("Sugar Level : "+str(value))
    def scrollvertical(self, value):
        self.ui.lineEditResult.setText("Pulse Rate : "+str(value))
    def sliderhorizontal(self, value):
        self.ui.lineEditResult.setText("Blood Pressure :"+str(value))
    def slidervertical(self, value):
        self.ui.lineEditResult.setText("Cholestrol Level : "+str(value))
if __name__=="__main__":
    app = QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

它是如何工作的...

在这个代码中,你将每个部件的valueChanged()信号分别与相关的函数关联,那么在部件中的滚动条或滑动条移动时,就会调用对应的函数来执行期望的任务。例如,当水平滚动条的滑块移动时,就会调用scrollhorizontal函数就会调用。这个scrollhorizontal函数通过Label部件显示了滚动条所表达的值,即Sugar Level(血糖水平)。类似的,当垂直滚动条上滑块移动时,就会调用scrollvertical函数,那么心率,也就是垂直滚动条滑块所表达的值,就会通过Label部件显示出来,如下截图所示:

同理,当水平和垂直滑动条移动时,对应的血压和胆固醇水平就会显示出,如下截图所示: