目录
1,步长调节器 实现控制上下能用的方法,并且可以调节范围,步长
1.1,验证器,限制步长调节编辑器的数据范围
2,步长调节器 其他API
2.1,设置步长调节器数值加速
2.2,设置步长调节器只读模式
2.3,步长调节编辑器,文本获取,与设置
2.4,步长调节编辑器,对齐方式
2.5,步长调节编辑器 周边框架
2.6,步长调节编辑器 加减按钮样式设置
2.7,步长调节编辑器 信号相关
**
# 步长调节编辑器
# 组合控件,左侧是一个数字文本框,右侧有一对增减按钮
# QSpinBox
# QDoubleSpinBox
# QDateTimeEdit
from PyQt5.Qt import *
#############################################################步长调节器 实现控制上下能用的方法
#
# 现在需求:
# 步长调节器 实现控制上下能用的方法,并且可以调节范围,步长
#
# 解决方法:
# 1,继承QAbstractSpinBox类,并重写两个方法;
# 2,方法stepEnabled用来确定数据范围,
# 做一个if判定 并返回 标识了是否可用的不同的类属性,
# 3,方法stepBy(p_int) 用来执行数据是否修改,调整步长
# 接受一个来自stepEnabled的参数p_int
# 如果stepEnabled在得到允许范围的数据输入后,返回了一个非StepNone
# 则,p_int一定非空,点增按钮,即为1;点减按钮,即为-1
# 拿到这个p_int一切就好办了
#
class MyAsb(QAbstractSpinBox):
def __init__(self,parent = None,num = '0',*args,**kwargs):#code4
super().__init__(parent,*args,**kwargs)#执行父类init方法 parent是啥就是啥
self.lineEdit().setText(num)
def stepEnabled(self):
# if len(self.lineEdit().text())==0:# code2
# return QAbstractSpinBox.StepNone
try: #code3
current_num = int(self.lineEdit().text())#code1
print(current_num)
if current_num == 18:
return QAbstractSpinBox.StepUpEnabled
elif current_num==180:
return QAbstractSpinBox.StepDownEnabled
elif current_num<0 or current_num>180:
return QAbstractSpinBox.StepNone
else:
return QAbstractSpinBox.StepUpEnabled|QAbstractSpinBox.StepDownEnabled
except: #code3
if len(self.lineEdit().text()) == 0: #code2
return QAbstractSpinBox.StepNone
return QAbstractSpinBox.StepNone
def stepBy(self, p_int):
print(p_int)
current_num = int(self.lineEdit().text()) + p_int
self.lineEdit().setText(str(current_num))
# code1: 因为QAbstractSpinBox是一个组合控件,
# 其左边就是一个单行文本编辑器,self.lineEdit()即是单行文本编辑器对象
#
# code2: 调节器啥都没输入时,点击增减按钮会直接崩溃退出,因为空字符无法int整型化
# 设置一个if判断
#
# code3: 步长调节器输入一个字母,或者汉字时,也会无法int整型化,崩溃退出
# 设置一个try--except,
# 这里其实发现,code2那两行判断可以直接放到except下面
#
# code4: 步长调节器 想要动态调整初始值,则添加init方法,参数内添加num = '默认值'
# asb创建步长调节器对象时可以指定 初始值参数num
#
##############################################################步长调节器 实现控制上下能用的方法
##############################################验证器,限制步长调节编辑器的数据范围
#
# 现在需求:
# 验证器,限制键序列编辑器的数据范围 18-180
#
# 解决方法:
# 设置验证器方法,重写两个方法 validate fixup
#
def validate(self, p_str, p_int):
try:
current_num = int(p_str)
if current_num<18:
return (QValidator.Intermediate,p_str,p_int)
elif current_num<=180:
return (QValidator.Acceptable,p_str,p_int)
else:
return (QValidator.Invalid,p_str,p_int)
except:
if len(p_str)==0:
return (QValidator.Intermediate,p_str,p_int)
return (QValidator.Invalid, p_str, p_int)
def fixup(self, p_str):
try:
current_num = int(p_str)
if current_num<18:
return '18'
return '180'
except:
return '180'
#############################验证器,限制步长调节编辑器的数据范围
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('QAbstractSpinBox_步长调节编辑器')
self.resize(500,500)
self.iniUI()
def iniUI(self):
asb = MyAsb(self,'5')#code4
self.asb = asb
asb.resize(self.width()*5/12,self.height()/12)
asb.move((self.width()-asb.width())/2,(self.height()-asb.height())/2)
##############################################设置步长调节器数值加速
#
# 现在需求:
# 当长按加减按钮之后,发现补偿调节器QAbstractSpinBox的文本框数值变化太慢,且匀速
# 现在想要速度快一点,
# 解决方法:
# asb.setAccelerated(True)
#
asb.setAccelerated(True)
#############################设置步长调节器数值加速
##############################################设置步长调节器只读模式
#
# 现在需求:
# 只能使用加减按钮点击 而不能使用键盘直接输入修改 单行文本框数据
#
# 解决方法:
# 设置只读模式
# asb.setReadOnly(True)
asb.setReadOnly(False)
#############################设置步长调节器只读模式
##############################################步长调节编辑器,文本获取,与设置
print(asb.text())
print(asb.lineEdit().text())
asb.lineEdit().setText('8')#asb左侧的le对象 调用setText方法
#############################步长调节编辑器,文本获取,与设置
##############################################步长调节编辑器,对齐方式
asb.setAlignment(Qt.AlignCenter)
#############################步长调节编辑器,对齐方式
##############################################步长调节编辑器 周边框架
asb.setFrame(True)#默认有边框True
#############################步长调节编辑器 周边框架
##############################################步长调节编辑器 加减按钮样式设置
# asb.setButtonSymbols(QAbstractSpinBox.NoButtons)
#############################步长调节编辑器 加减按钮样式设置
##############################################步长调节编辑器 信号相关
asb.editingFinished.connect(lambda :print('结束了编辑……'))
#############################步长调节编辑器 信号相关
btn = QPushButton(self)
self.btn = btn
self.btn_w = self.width() / 3
self.btn_h = self.height() * 3 / 32
self.btn.resize(self.btn_w, self.btn_h)
self.btn_x = (self.width() - self.btn_w) / 2
self.btn_y = self.height() * 7 / 8 + (self.height() / 8 - self.btn_h) / 2
self.btn.setText('测试按钮')
self.btn.setStyleSheet('font-size:30px')
self.btn.move(self.btn_x, self.btn_y)
self.btn.clicked.connect(self.btn_text)
def btn_text(self):
pass
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())