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 # 加减按钮
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_())