QAbstractSpinBox 步长调节控件父控件
- 描述
- 由一个步长调节器和单行文本框(QLineEdit对象)来调节和显示数据
- 继承:QWidget
- 抽象类,虽然可以直接用该类创建对象,但是右侧的调节按钮并不起作用
- QAbstractSpinBox对象里面的功能都是共性的功能,所以并不能为其固定成单一的性质
- 需要子类化该类,然后用户根据自己的需要对其进行设置
- QAbstractSpinBox对象操作执行过程
-
- 实例化对象的时候,会执行
__init__
方法
- 实例化对象的时候,会执行
-
- 当用户点击右侧步长调节器时,会先执行
stepEnabled()
,并返回上下键的可用状态(QAbstractSpinBox枚举)
- 当用户点击右侧步长调节器时,会先执行
-
- 当按下的按键处于可用状态时,会执行
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_())