12. 滑块类控件

一、抽象滑块

  QScrollBar滚动条控件)、QSlider滑块控件)和 QDail仪表盘控件)都是从 QAbstractSlider 类继承而来的,因此它们的多数方法是相同的。

  我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install pyside6 -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

滑块控件

  QAbstractSlider 类的常用方法如下:

# 实例方法
orientation() -> Qt.Orientation                                                 # 获取控件方向

setInvertedAppearance(enable:bool) -> None                                      # 设置几何外观左右和上下颠倒
invertedAppearance() -> bool                                                    # 获取几何外观是否颠倒

setInvertedControls(enable:bool) -> None                                        # 设置键盘上的PageUp和PageDown键是否反向
invertedControls() -> bool                                                      # 获取是否进行逆向控制

setMinimum(value:int) -> None                                                   # 设置最小值
minimum() -> int                                                                # 获取最小值

setMaximum(value:int) -> None                                                   # 设置最大值
maximum() -> int                                                                # 获取最大值

setPageStep(step:int) -> None                                                   # 设置每次单击滑动区域或者按下PageUp/PageDown键,控件值的变化量
pageStep() -> int                                                               # 获取单击滑动区域或者按下PageUp/PageDown键,控件值的变化量

setSingleStep(step:int) -> None                                                 # 设置按方向键滑块的步长,控件值的变化量
singleStep() -> int                                                             # 获取设置按方向键滑块的步长,控件值的变化量

setSliderDown(enable:bool) -> None                                              # 设置滑块是否被按下,该值的设置会影响isSliderDown()的返回值
isSliderDown() -> bool                                                          # 用鼠标移动滑块时,返回True,单击两端的箭头或滑动区域时,返回False

setSliderPosition(position:int) -> None                                         # 设置滑块的位置
sliderPosition() -> int                                                         # 获取滑块位置

setTracking(enable:bool) -> None                                                # 设置是否追踪滑块的连续变化

value() -> int                                                                  # 获取滑块的值

# 槽函数
setOrientation(prientation:Qt.Orientation) -> None                              # 设置控件方向,可设置为水平或垂直方向
setRange(min: int, max: int) -> None                                            # 设置滑块范围
setValue(value:int) -> None                                                     # 设置滑块的值

  要 改变滑块的位置或值,可以 用鼠标拖动滑块的位置单击两端的箭头,如果焦点在控件上,还可以 通过键盘上的左右箭头来控制,这时值的 增加或减少的步长setSingleStep(step:int) 方法来设置。另外还可以 单击滑块的滑行轨道,或者用键盘上的 PageUpPageDown 键来改变值,这时值的增加或减少的步长由 setPageStep(step:int) 方法来设置。

  如果用键盘来移动滑块的位置,滑块控件默认是不获得焦点的,可以通过 setFocusPolicy(policy:Qt.FocusPolicy) 方法设置其能 获得焦点

  当设置 setTracking(enable:bool)False 时,用 鼠标拖动滑块连续移动 时(鼠标按住不松开),控件不发送 valueChanged 信号。

  滑块常用信号及其说明如下:

actionTriggered(action:int)                                                     # 动作触发时发射信号
rangeChanged(min:int, max:int)                                                  # 滑块范围改变时发射信号
sliderMoved(position:int)                                                       # 滑块移动时发射信号,只有拖拽时触发
sliderPressed()                                                                 # 滑块按下时发射信号
sliderReleased()                                                                # 滑块释放时发射信号
valueChanged(value:int)                                                         # 值改变时发射信号

  actionTriggered(action:int) 信号 在用户用鼠标或键盘键改变滑块位置时发送,根据改变方式的不同,信号的参数值也不同,action 的值可以取值如下:

QAbstractSlider.SliderAction.SliderNoAction
QAbstractSlider.SliderAction.SliderSingleStepAdd
QAbstractSlider.SliderAction.SliderSingleStepSub
QAbstractSlider.SliderAction.SliderPageStepAdd
QAbstractSlider.SliderAction.SliderPageStepSub
QAbstractSlider.SliderAction.SliderToMinimum
QAbstractSlider.SliderAction.SliderToMaximum
QAbstractSlider.SliderAction.SliderMove

二、滑块控件

  PySide6 中提供了两个滑块控件,分别是 水平滑块 HorizontalSlider 和 垂直滑块 VerticalSlider,但这两个滑块控件对应的类都是 QSlider 类,该类提供一个 setOrientation(orientation:Qt.Orientation) 方法,通过设置该方法的参数,可以将 滑块显示为水平或者垂直

  用 QSlider 类创建实例对象的方法如下:

QSlider(parent:QWidget=Noone)
QSlider(orientation:Qt.Orientation, parent:QWidget=None)

  其中,parent窗口 或者 容器 类控件,参数 orientatonQt.Orientation 类型的枚举值,可以取值如下:

Qt.Orientation.Horizontal                                                       # 表示水平滑块
Qt.Orientation.Vertical                                                         # 表示竖直滑块

  QSlider 滑块类的特有方法及其说明如下:

setTickInterval(ti:int) -> None                                                 # 设置滑块的刻度间隔
setTickPosition(position:QSlider.TickPosition) -> None                          # 设置刻度的位置

  QSlider 可以设置刻度,方法是 setTickInterval(interval:int),其中参数 interval刻度间距。用 tickInterval() 方法可以 获取刻度间距值,其中 QSlider.TickPosition 枚举值可以取值如下:

QSlider.TickPosition.NoTicks                                                    # 不显示刻度,这是默认
QSlider.TickPosition.TicksBothSides                                             # 在滑块的两侧都显示刻度
QSlider.TickPosition.TicksAbove                                                 # 在水平滑块的上方显示刻度
QSlider.TickPosition.TicksBelow                                                 # 在水平滑块的下方显示刻度
QSlider.TickPosition.TicksLeft                                                  # 在垂直滑块的左侧显示刻度
QSlider.TickPosition.TicksRight                                                 # 在垂直滑块的右侧显示刻度

  我们新建一个 ui.py 文件,用来存放 UI 相关的代码。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QSlider
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtCore import Qt

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(300, 60)                                                  # 1.设置窗口对象大小

        self.slider = QSlider(window)                                           # 2.创建滑块控件
        self.label = QLabel(window)                                             # 3.创建标签控件

        layout = QVBoxLayout(window)                                            # 4.创建垂直布局
        layout.addWidget(self.slider)                                           # 5.添加控件到布局中
        layout.addWidget(self.label)

        self.slider.setOrientation(Qt.Orientation.Horizontal)                   # 6.设置滑块的显示方向,如果不设置默认是垂直方向
        self.slider.setTickPosition(QSlider.TickPosition.TicksBelow)            # 7.设置滑块刻度的标记位置

        self.slider.setRange(0, 100)                                            # 8.设置滑块的取值范围
        self.slider.setTickInterval(10)                                         # 9.设置滑块的刻度间隔

        self.slider.setPageStep(5)                                              # 10.设置单击滑动区域或者按下PageUp/PageDown键的步长
        self.slider.setSingleStep(10)                                           # 11.设置按方向键滑块的步长

        self.slider.setValue(50)                                                # 12.设置滑块的当前值


        # 13.获取滑块的最小值,最大值和当前值,然后设置标签的值
        text = f"min: {self.slider.minimum()}, max: {self.slider.maximum()}, value: {self.slider.value()})"
        self.label.setText(text)

  我们新建一个 widget.py 文件,用来存放业务逻辑相关的代码。

import sys

from PySide6.QtWidgets import QApplication, QWidget

from ui import MyUi

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()                                                      # 1.调用父类Qwidget类的__init__()方法
      
        self.__ui = MyUi()
        self.__ui.setupUi(self)                                                 # 2.初始化页面
  
        self.__ui.slider.sliderPressed.connect(self.slider_pressed)             # 3.关联滑块按下时触发信号
        self.__ui.slider.sliderReleased.connect(self.slider_released)           # 4.关联滑块释放时触发信号
        self.__ui.slider.valueChanged.connect(self.slider_value_changed)        # 5.关联滑块值改变时触发信号

    def slider_pressed(self):
        self.__ui.label.setText("滑块被按下了")

    def slider_released(self):
        self.__ui.label.setText("滑块被释放了")

    def slider_value_changed(self, value):
        self.__ui.label.setText(f"滑块的值被改变了,改变后的值为:{value}")

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    window = MyWidget()                                                         # 2.创建一个窗口
    window.show()                                                               # 3.显示窗口
    sys.exit(app.exec())                                                        # 4.进入程序的主循环,并通过exit函数确保主循环安全结束

三、滚动条控件

  PySide6 中提供了两个滚动条控件,分别是水平滚动条(HorizontalScrollBar)和垂直滚动条(VericalScrollBar),但两个滚动条控件对应的类都是 QScrollBar 类,这两个控件通过水平或者垂直的滚动条可以扩大当前窗口的有效装载面积,从而装在更多的控件。

  用 QScrollBar 类创建实例对象的方法如下:

QScrollBar(parent:QWidget=Noone)
QScrollBar(orientation:Qt.Orientation, parent:QWidget=Noone)

  其中,parent窗口 或者 容器 类控件,Qt.Orientation 枚举值可以取值如下:

Qt.Orientation.Horizontal                                                       # 表示水平滑块
Qt.Orientation.Vertical                                                         # 表示竖直滑块

  我们修改 ui.py 文件的内容。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QScrollBar
from PySide6.QtWidgets import QVBoxLayout
from PySide6.QtCore import Qt

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(300, 60)                                                  # 1.设置窗口对象大小

        self.scrollBar = QScrollBar(window)                                     # 2.创建滚动条控件
        self.label = QLabel(window)                                             # 3.创建标签控件

        layout = QVBoxLayout(window)                                            # 4.创建垂直布局
        layout.addWidget(self.scrollBar)                                        # 5.添加控件到布局中
        layout.addWidget(self.label)

        self.scrollBar.setOrientation(Qt.Orientation.Horizontal)                # 6.设置滚动条的显示方向,如果不设置默认是垂直方向

        self.scrollBar.setRange(0, 100)                                         # 7.设置滚动条的取值范围
        self.scrollBar.setSingleStep(10)                                        # 8.设置单击滚动条两端的箭头的步长
        self.scrollBar.setValue(50)                                             # 9.设置滑块的当前值


        # 10.获取滑块的最小值,最大值和当前值,然后设置标签的值
        text = f"min: {self.scrollBar.minimum()}, max: {self.scrollBar.maximum()}, value: {self.scrollBar.value()})"
        self.label.setText(text)

  我们修改 widget.py 文件的内容。

import sys

from PySide6.QtWidgets import QApplication, QWidget

from ui import MyUi

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()                                                      # 1.调用父类Qwidget类的__init__()方法
      
        self.__ui = MyUi()
        self.__ui.setupUi(self)                                                # 2.初始化页面
  
        self.__ui.scrollBar.sliderPressed.connect(self.scrollBal_slider_pressed)    # 3.关联滑块按下时触发信号
        self.__ui.scrollBar.sliderReleased.connect(self.scrollBal_slider_released)  # 4.关联滑块释放时触发信号
        self.__ui.scrollBar.sliderMoved.connect(self.scrollBal_slider_moved)        # 5.关联滑块移动时触发信号

    def scrollBal_slider_pressed(self):
        self.__ui.label.setText("滑块被按下了")

    def scrollBal_slider_released(self):
        self.__ui.label.setText("滑块被释放了")

    def scrollBal_slider_moved(self, value):
        self.__ui.label.setText(f"滑块被拖拽到:{value} 处")

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    window = MyWidget()                                                         # 2.创建一个窗口
    window.show()                                                               # 3.显示窗口
    sys.exit(app.exec())                                                        # 4.进入程序的主循环,并通过exit函数确保主循环安全结束

四、仪表盘控件

  仪表盘控件(QDail)本质上类似于一个滑块控件,只是显示的样式不同。

  用 QDail 类创建实例对象的方法如下:

QDail(parent:QWidget=Noone)

  其中,parent窗口 或者 容器 类控件。

  QDail 类的特有方法及其说明如下:

# 实例方法
notchesVisible() -> bool                                                        # 获取刻度是否可见

setNotchTarget(target:float) -> None                                            # 设置刻度之间的距离
notchTarget() -> float                                                          # 获取刻度之间的距离

wrapping() -> bool                                                              # 获取最大值和最小值刻度是否重合

notchSize() -> float                                                            # 获取相邻刻度之间的值

# 槽函数
setNotchesVisible(visible:bool) -> None                                         # 设置刻度是否可见
setWrapping(on:bool) -> None                                                    # 设置最大值和最小值刻度是否重合

  我们修改 ui.py 文件的内容。

from PySide6.QtWidgets import QWidget
from PySide6.QtWidgets import QLabel, QDial
from PySide6.QtWidgets import QVBoxLayout

class MyUi:
    def setupUi(self, window:QWidget):
        window.resize(300, 160)                                                 # 1.设置窗口对象大小

        self.dial = QDial(window)                                               # 2.创建仪表盘控件
        self.label = QLabel(window)                                             # 3.创建标签控件

        layout = QVBoxLayout(window)                                            # 4.创建垂直布局
        layout.addWidget(self.dial)                                             # 5.添加控件到布局中
        layout.addWidget(self.label)

        self.dial.setNotchesVisible(True)                                       # 6.设置是否显示刻度
        self.dial.setWrapping(True)                                             # 7.设置刻度的最小值和最大值是否重合

        self.dial.setRange(0, 100)                                              # 8.设置滚动条的取值范围
        self.dial.setSingleStep(10)                                             # 9.设置单击滚动条两端的箭头的步长
        self.dial.setValue(50)                                                  # 10.设置滑块的当前值

        # 11.获取滑块的最小值,最大值和当前值,然后设置标签的值
        text = f"min: {self.dial.minimum()}, max: {self.dial.maximum()}, value: {self.dial.value()})"
        self.label.setText(text)

  我们修改 widget.py 文件的内容。

import sys

from PySide6.QtWidgets import QApplication, QWidget

from ui import MyUi

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()                                                      # 1.调用父类Qwidget类的__init__()方法
      
        self.__ui = MyUi()
        self.__ui.setupUi(self)                                                # 2.初始化页面
  
        self.__ui.dial.sliderPressed.connect(self.dial_slider_pressed)          # 3.关联滑块按下时触发信号
        self.__ui.dial.sliderReleased.connect(self.dial_slider_released)        # 4.关联滑块释放时触发信号
        self.__ui.dial.sliderMoved.connect(self.dial_slider_moved)              # 5.关联滑块移动时触发信号

    def dial_slider_pressed(self):
        self.__ui.label.setText("滑块被按下了")

    def dial_slider_released(self):
        self.__ui.label.setText("滑块被释放了")

    def dial_slider_moved(self, value):
        self.__ui.label.setText(f"滑块被拖拽到:{value} 处")

if __name__ == "__main__":
    app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例
    window = MyWidget()                                                         # 2.创建一个窗口
    window.show()                                                               # 3.显示窗口
    sys.exit(app.exec())                                                        # 4.进入程序的主循环,并通过exit函数确保主循环安全结束
posted @ 2024-12-31 20:33  星光映梦  阅读(181)  评论(0)    收藏  举报