046.PyQt5_QAbstractSpinBox_步长调节器基类

QAbstractSpinBox 步长调节控件父控件

  • 描述
    • 由一个步长调节器和单行文本框(QLineEdit对象)来调节和显示数据
  • 继承:QWidget
    • 抽象类,虽然可以直接用该类创建对象,但是右侧的调节按钮并不起作用
    • QAbstractSpinBox对象里面的功能都是共性的功能,所以并不能为其固定成单一的性质
    • 需要子类化该类,然后用户根据自己的需要对其进行设置
  • QAbstractSpinBox对象操作执行过程
      1. 实例化对象的时候,会执行__init__方法
      1. 当用户点击右侧步长调节器时,会先执行 stepEnabled() ,并返回上下键的可用状态(QAbstractSpinBox枚举)
      1. 当按下的按键处于可用状态时,会执行 stepBy() 方法,对QAbstractSpinBox对象中的QLineEdit对象的文本内容进行处理
  • 功能作用
  • 子类化此类
    class MySpinBox(QAbstractSpinBox):
        pass
    
  • 重写实现控制上下能用的方法
    # 重写方法,根据判断条件返回不同的枚举值来控制上下键是否可用
    stepEnabled(self) -> QAbstractSpinBox.StepEnabled
        # 返回值
            QAbstractSpinBox.StepNone                   # 上下键都不能用
            QAbstractSpinBox.StepUpEnabled              # 上可用
            QAbstractSpinBox.StepDownEnabled            # 下可用
    
  • 实现步长调整方法
    • 按键可用状态时,按键被按下时触发该方法
    stepBy(self, steps: int) -> None
        # 参数 steps
            # 向上键:默认steps 为1
            # 向下键:默认steps 为-1
            
        # 如果需要修改步长,则通过 p_int * 指定步长
    
  • 长按调整步长加快频率
    setAccelerated(bool)            # 设置是否开启加速度,为True,则调整速度越来越快
    
    isAccelerated() -> bool         # 获取是否开启加速度
    
  • 设置只读
    • 只允许用户通过步长调节器调节, 不能使用键盘直接输入内容修改控件的值
    setReadOnly(bool r)             # 设置步长调节器是否为只读模式
    
    isReadOnly() -> bool            # 判断步长调节器是否为只读模式
    
  • 设置以及获取内容
    text() -> str                       # 获取文本框内的文本内容
    lineEdit() -> QLineEdit             # 获取到QAbstractSpinBox对象中的QlineEdit对象
    lineEdit().setText(str)             # 再通过QLineEdit对象的setText方法设置文本内容
    
    # 扩展:
        # 这里可以获取到控件中的QLineEdit对象
        # 那么之前学的QLineEdit对象的功能方法均可以使用
    
  • 对齐方式
    setAlignment(Qt.Alignment)          # 设置控件文本对齐方式
    alignment() -> Qt.Alignment         # 获取控件文本对齐方式
    
  • 设置周边框架
    setFrame(bool)                      # 设置控件周边是否有框架,默认True
    
    hasFrame() -> bool                  # 获取控件周边是否有框架
    
  • 清空文本框内容
    clear()                             # 清空控件内文本内容
    
  • 设置右侧按钮样式
    asb.setButtonSymbols(QAbstractSpinBox.ButtonSymbols)
        # 参数 QAbstractSpinBox.ButtonSymbols
            QAbstractSpinBox.NoButtons              # 不显示按钮
            QAbstractSpinBox.UpDownArrows           # 上下箭头按钮
            QAbstractSpinBox.PlusMinus              # 加减按钮
    
    
  • 内容验证
    • 通过右侧调节器修改文本内容时候才会调用stepEnabled()和stepBy()方法
    • 所以验证不能做到这两个方法中,需要重写validate()和fixup()
    • 通过调节器修改文本内容,不会触发validate()和fixup()方法,但是当控件失去焦点时,还是会触发这两个方法
    validate(self, p_str, p_int)        # 验证规则
    fixup(self, p_str)                  # 修复方法
    

  • 可用信号
    # 继承父类QWidget相关信号
    
    editingFinished()                   # 结束编辑时调用
    

  • 示例代码
    from PyQt5.Qt import *
    import sys
    
    class MySpinBox(QAbstractSpinBox):
        def __init__(self,parent=None, num='0', *args, **kwargs):
            """num为默认值,在实例化对象的时候传进来"""
            super(MySpinBox, self).__init__(parent, *args, **kwargs)
            self.lineEdit().setText(num)        # 设置文本内容默认为0
    
        def stepEnabled(self) -> 'QAbstractSpinBox.StepEnabled':
            # ****************根据条件返回不同的状态****************** 开始
            # num = int(self.text())
            # if num == 0:
            #     return QAbstractSpinBox.StepUpEnabled       # 当文本框内容为0时,向上按键可用
            # elif num == 100:
            #     return QAbstractSpinBox.StepDownEnabled     # 当文本框内容为100时,向下按键可用
            # elif num < 0 or num > 100:
            #     return QAbstractSpinBox.StepNone            # 文本内容小于0或者大于100,向上和向下键都不可用
            # else:
            #     return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled    # 文本内容在0~100之间,向上和向下键可用
    
            # ****************根据条件返回不同的状态****************** 结束
            return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled    # 不判断条件,上下键都可用
    
        def stepBy(self, steps: int) -> None:
            """
            按键为可用状态时,点击按键会执行该方法
            按下向上键,steps参数默认为1
            按下向下键,steps参数默认为-1
            """
            # steps = steps * 2               # 设置步长为2
            num = int(self.text())          # 获取到文本内容,并强制转换为整形数据
            reslut = num + steps            # 计算结果
            self.lineEdit().setText(str(reslut))    # 将结果设置为文本内容
    
        def validate(self, input: str, pos: int):
            num = int(input)
            if num < 18:
                return (QValidator.Intermediate, input, pos)
            elif num <= 180:
                return (QValidator.Acceptable, input, pos)
            else:
                return (QValidator.Invalid, input, pos)
    
        def fixup(self, input: str) -> str:
            return '18'
    
    class Windows(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle('QAbstractSpinBox创建使用')
            self.resize(500, 500)
            self.widget_list()
    
        def widget_list(self):
            self.add_widget()
    
    
        def add_widget(self):
            asb = MySpinBox(self,'20')
            asb.resize(100, 30)
            asb.move(100, 50)
    
            btn = QPushButton('测试',self)
            btn.move(100, 100)
    
            # ****************长按控件是否开启加速度****************** 开始
            # print(asb.isAccelerated())      # 获取控件是否开启加速度,默认是False
            # asb.setAccelerated(True)        # 设置为True,开启加速度,增加速度会越来越快
    
            # ****************长按控件是否开启加速度****************** 结束
            pass
            # ****************设置控件是否为可读****************** 开始
            # asb.setReadOnly(True)       # True,则设置为只读,不允许直接输入内容修改控件的值
    
            # ****************设置控件是否为可读****************** 结束
            pass
            # ****************文本内容获取和设置****************** 开始
            # print(asb.text())       # 获取文本内容
            # 
            # asb.lineEdit().setText('888')       # 先获取步长调节器中的QLineEdit对象,再通过QLineEdit对象修改值
            # 
            # # 扩展,通过QLineEdit对象设置
            # cl = QCompleter(['Fz','12','18','23'], asb)
            # asb.lineEdit().setCompleter(cl)         # 通过QLineEdit对象设置完成器(下拉记录)
            # 
            # asb.lineEdit().setAlignment(Qt.AlignCenter)     # 通过QLineEdit对象设置对齐方式
            # ****************文本内容获取和设置****************** 结束
            pass
            # ****************设置对齐方式****************** 开始
            # asb.setAlignment(Qt.AlignRight)         # 通过控件本身设置文本内容对其方式(居右)
            
            # ****************设置对齐方式****************** 结束
            pass
            # ****************设置周边是否有框架****************** 开始
            # asb.setFrame(False)                     # 设置控件周边没有边框
            
            # ****************设置周边是否有框架****************** 结束
            pass
            # ****************设置右侧按钮样式****************** 开始
            #
            # asb1 = MySpinBox(self, '10')
            # asb1.resize(100, 30)
            # asb1.move(100, 100)
            #
            # asb2 = MySpinBox(self, '20')
            # asb2.resize(100, 30)
            # asb2.move(100, 150)
            #
            # asb.setButtonSymbols(QAbstractSpinBox.NoButtons)
            # asb1.setButtonSymbols(QAbstractSpinBox.UpDownArrows)
            # asb2.setButtonSymbols(QAbstractSpinBox.PlusMinus)
    
            # ****************设置右侧按钮样式****************** 结束
            pass
            # ****************内容验证****************** 开始
            # 通过右侧调节器修改文本内容时候才会调用stepEnabled()和stepBy()方法
            # 所以验证不能做到这两个方法中,需要重写validate()和fixup()
            # 通过调节器修改文本内容,不会触发validate()和fixup()方法,但是当控件失去焦点时,还是会触发这两个方法
            
            # ****************内容验证****************** 结束
            pass
            # ****************可用信号****************** 开始
            asb.editingFinished.connect(lambda :print('编辑结束了'))
            
            # ****************可用信号****************** 结束
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Windows()
    
        window.show()
        sys.exit(app.exec_())

你可能感兴趣的:(PyQt5,qt5,pyqt,python,qt,开发语言)