054.PyQt5_QSlider_垂直或水平滑块

QSlider 垂直或水平滑块

  • 描述

    • 垂直或水平滑块
    • 它允许用户沿水平或垂直凹槽移动滑块手柄,并将手柄的位置转换为合法范围内的整数值
  • 继承自:QAbstractSlider

  • 功能作用

    • 继承自父类
    • 构造方法
      QSlider(parent: QWidget = None)                     # 创建对象的同时设置父对象
      QSlider(Qt.Orientation, parent: QWidget = None)     # 创建对象的同时设置控件方向和父对象
      
    • 刻度控制
      setTickPosition(self, QSlider.TickPosition)         # 设置刻度位置
              QSlider.NoTicks                             # 0 不要画任何刻度线。
              QSlider.TicksBothSides                      # 3 在凹槽两侧画刻度线。
              QSlider.TicksAbove                          # 1 在(水平)滑块上方绘制刻度线
              QSlider.TicksBelow                          # 2 在(水平)滑块下方绘制刻度线
              QSlider.TicksLeft                           # 1 在(垂直)滑块的左侧绘制刻度线
              QSlider.TicksRight                          # 2 在(垂直)滑块右侧绘制刻度线
              
      tickPosition() -> QSlider.TickPosition              # 获取刻度位置,返回QSlider的枚举值
      
      setTickInterval(int)                                # 设置刻度之间的间隔
      # 这是值间隔,而不是像素间隔。如果为0,滑块将在singleStep和pageStep之间进行选择
      
      setPageStep(int)                                    # 通过设置每页步长也可以修改刻度之间的间隔
      # 同时设置的时候,刻度间隔以setTickInterval设置的为准
      
      sd.tickInterval() -> int                            # 获取刻度之间的间隔值
      
  • 注意事项

    • 滑块的值并不是滑块的Y坐标
    • 值与Y坐标的关系
      Y / height = (最大值 - 最小值 - 当前值) / (最大值 - 最小值)
      
      Y / height = 1 - 当前值 / (最大值 - 最小值)
      
      Y = (1 - 当前值 / (最大值 - 最小值)) * height
      
      # 最大值 - 最小值 是计算当前控件的取值范围。滑块的最小值并不一定是从0开始
      
  • 可用信号

    • 继承自父类

  • 示例代码
  • 示例1:QSlider-功能作用
    from PyQt5.Qt import *
    import sys
    
    class Windows(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QSlider-功能作用')
            self.resize(500500)
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
    
        def add_widget(self):
            sld1 = QSlider(self)
            sld2 = QSlider(Qt.Horizontal, self)
    
            sld1.move(100100)
            sld2.move(200100)
    
            sld1.setMinimum(0)
            sld1.setMaximum(100)
    
            # sld1.setTickPosition(QSlider.TicksLeft)
            # sld1.setTickPosition(QSlider.TicksRight)
            # sld1.setTickPosition(QSlider.TicksLeft | QSlider.TicksRight)
            #
            # sld2.setTickPosition(QSlider.TicksAbove)
            # sld2.setTickPosition(QSlider.TicksBelow)
            # sld2.setTickPosition(QSlider.TicksAbove | QSlider.TicksBelow)
    
            sld1.setTickPosition(QSlider.TicksBothSides)
            sld2.setTickPosition(QSlider.TicksBothSides)
    
            print(sld1.tickPosition())
    
            sld1.resize(30200)
    
            sld1.setTickInterval(5)         # 设置刻度之间的间隔
            sld1.setPageStep(10)             # 通过设置每页步长也可以修改刻度之间的间隔
            # 同时设置的时候,刻度间隔以setTickInterval设置的为准
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())
    
  • 示例2:拓展案例
    • 要求
      • 在滑块移动时, 通过标签, 展示滑块当前数值
      • 并要求标签位置, 一直在滑块所在位置中间
    • 示例效果
      • 054.PyQt5_QSlider_垂直或水平滑块_第1张图片

    • 示例代码
      from PyQt5.Qt import *
      import sys
      
      
      class MySlider(QSlider):
          def __init__(self, parent=None, *args, **kwargs):
              super().__init__(parent, *args, **kwargs)
              self.setup_ui()
      
      
          def setup_ui(self):
              self.labe = QLabel(self)
              self.labe.setText('0')
              self.labe.hide()
              # self.labe.setStyleSheet("color: yellow;")
      
          def mousePressEvent(self, evt) -> None:
              super().mousePressEvent(evt)
              self.labe.show()
              x = int((self.width() - self.labe.width())/2)
              y = int((1- self.value()/(self.maximum() - self.minimum())) * self.height() - self.labe.height())
              self.labe.move(x, y)
      
          def mouseMoveEvent(self, evt) -> None:
              super().mouseMoveEvent(evt)
              x = int((self.width() - self.labe.width()) / 2)
              y = int((1 - self.value() / (self.maximum() - self.minimum())) * (self.height() - self.labe.height()))
              self.labe.move(x, y)
              self.labe.setText(str(self.value()))
              self.labe.adjustSize()
      
          def mouseReleaseEvent(self, evt) -> None:
              super().mouseReleaseEvent(evt)
              self.labe.hide()
      
      class Windows(QWidget):
          def __init__(self):
              super().__init__()
              self.setWindowTitle('QSlider-案例')
              self.resize(500500)
              self.widget_list()
      
          def widget_list(self):
              self.add_widget()
      
      
          def add_widget(self):
              # 由于我们需要将显示数值的标签对象和滑块对象作为一个整体
              # 所以我们需要将两者进行封装,所以我们子类化QSlider
              sld = MySlider(self)
              sld.resize(50200)
              sld.move(10050)
              sld.setTickPosition(QSlider.TicksBothSides)
      
      if __name__ == '__main__':
          app = QApplication(sys.argv)
          window = Windows()
      
          window.show()
          sys.exit(app.exec_())

       

你可能感兴趣的:(PyQt5,pyqt5,pyqt,python,qt,python,gui)