继承与 QWidget--->QAbstractSpinBox
QAbstractSpinBox
import sys from PyQt5.QtWidgets import QApplication, QWidget,QAbstractSpinBox,QPushButton from PyQt5.QtGui import QValidator class Myasb(QAbstractSpinBox): #子类化QAbstractSpinBox def __init__(self,parent=None,num="0",*args,**kwargs): super().__init__(parent,*args,**kwargs) self.lineEdit().setText(num) #设置初始值 def stepEnabled(self): #实现控制上下按钮能用的方法 #比如 0---100有效 if int(self.text())==0: return QAbstractSpinBox.StepUpEnabled #上可用 elif int(self.text())==100: return QAbstractSpinBox.StepDownEnabled #下可用 elif int(self.text())>100 or int(self.text())<0: return QAbstractSpinBox.StepNone #都不能用 else: return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled #上下都可用 def stepBy(self, p_int): #用户按下步长按钮时,会自动调用这个方法 #用户按下按钮时的处理方法 #p_int 用户点击步长按钮时,返回的增量-->1 或 -1 s=int(self.text())+p_int self.lineEdit().setText(str(s)) #给控件中的单行文本编辑框设置文本 def validate(self, p_str, p_int): #验证规则 #p_str 是文本框的内容 #p_int 是光标的位置 #我要验证20--80的数据 num=int(p_str) if num<20 : #如果是小于20就返回 暂不作判定是否通过验证 return (QValidator.Intermediate, p_str, p_int) elif 20<=num <=80 : return (QValidator.Acceptable, p_str, p_int) #验证通过 else: return (QValidator.Invalid, p_str, p_int) # 验证不通过 pass def fixup(self, p_str):#修复函数 num=int(p_str) if num>80 : return '80' if num<20: return '20' pass #看 https://www.cnblogs.com/liming19680104/p/10356797.html class Demo(QWidget): def __init__(self): super().__init__() self.resize(300,300) btn=QPushButton('按钮',self) btn.clicked.connect(self.A) btn.move(50,100) asb=Myasb(self,'50') #实例化一个自定义的步长调节器 self.asb = asb asb.move(50,50) asb.resize(100,30) asb.setAccelerated(True) #设置长按时是否加速 #isAccelerated() -> bool 返回是否加速 asb.setReadOnly(True) #设置只读--用户只能通过调节按钮改变数字,不能在编辑框中输入数值 #isReadOnly() -> bool 返回是否只读 #除了父类信号外,还有以下一个信号 asb.editingFinished.connect(lambda :print('结束编辑')) #结束编辑时调用 def A(self): #print(self.asb.text()) #返回文本编辑框中显示的文本 print(self.asb.lineEdit().text()) # 返回文本编辑框中显示的文本 #self.asb.lineEdit().setText('88') #设置文本编辑框中的文本 #self.asb.setAlignment(Qt.AlignHCenter) #设置对齐方式 #参数看 https://www.cnblogs.com/liming19680104/p/10353781.html #self.asb.setFrame(False) #设置是否有周边框架--默认是True #hasFrame() -> bool 返回是否有边框 #self.asb.clear() #清空内容 #单行文本编辑器的方法都可以使用 if __name__ == '__main__': app = QApplication(sys.argv) demo = Demo() demo.show() sys.exit(app.exec_())
QSpinBox
样式:
主要处理整数和离散值集
import sys from PyQt5.QtWidgets import QApplication, QWidget,QPushButton,QSpinBox class SB(QSpinBox): #子类化,重写textFromValue方法--自定义展示格式 def textFromValue(self, p_int): #每次改变数值,都会调用此函数 #p_int 是编辑框中显示的值 print('suzi',p_int) return str(p_int)+'*'+ str(p_int) #返回给编辑框的文本 pass class Demo(QWidget): def __init__(self): super().__init__() self.resize(300,300) btn=QPushButton('按钮',self) btn.clicked.connect(self.A) btn.move(50,100) sb=SB(self) #实例化一个对象 self.sb=sb sb.move(50,50) sb.resize(100,30) #sb.valueChanged.connect(self.B) #值改变时发出信号 #会向槽函数传递一个整数值---文本框中改变后的值 sb.valueChanged[str].connect(self.B) # 值改变时发出信号 # 会向槽函数传递一个字符串---文本框中改变后的文本 #设置数值范围--默认调整0到99范围之间的整数 sb.setMaximum(50) #设置最大值 #maximum() -> int 返回最大值 sb.setMinimum(10) #设置最小值 #minimum() -> int 返回最小值 sb.setRange(5, 40) #设置数值区间 sb.setWrapping(True) #设置是否数值循环 #wrapping() -> bool 返回是否数值循环 sb.setSingleStep(1) #设置步长 #singleStep() -> int 返回步长 sb.setPrefix("周") #设置前缀 #prefix() -> str 返回前缀 sb.setSuffix("月") #设置后缀 #suffix() -> str 返回后缀 sb.setSpecialValueText('最小值') #当数据到达最小值时, 会显示此字符串 sb.setDisplayIntegerBase(16) #设置数据的进制---默认10进制 #displayIntegerBase() -> int 返回进制 def B(self,i): print('值改变了',i) pass def A(self): self.sb.setValue(25) # 设置值 s = self.sb.value() # 返回值--十进制-不包括前缀后缀 if __name__ == '__main__': app = QApplication(sys.argv) demo = Demo() demo.show() sys.exit(app.exec_())
s=self.sb.cleanText() #获取编辑框的内容--文本格式
QDoubleSpinBox-浮点
import sys
from PyQt5.QtWidgets import QApplication, QWidget,QPushButton,QDoubleSpinBox
class SB(QDoubleSpinBox): #子类化,重写textFromValue方法--自定义展示格式
def textFromValue(self, p_int): #每次改变数值,都会调用此函数
#p_int 是编辑框中显示的值
return str(p_int)+'*'+ str(p_int) #返回给编辑框的文本
pass
class Demo(QWidget):
def __init__(self):
super().__init__()
self.resize(300,300)
btn=QPushButton('按钮',self)
btn.clicked.connect(self.A)
btn.move(50,100)
sb=SB(self) #实例化一个对象
self.sb=sb
sb.move(50,50)
sb.resize(150,30)
sb.setDecimals(2) #设置小数位数
#decimals() -> int 返回小数位数
#sb.valueChanged.connect(self.B) #值改变时发出信号
#会向槽函数传递一个浮点数---文本框中改变后的值
sb.valueChanged[str].connect(self.B) # 值改变时发出信号
# 会向槽函数传递一个字符串---文本框中改变后的文本
#设置数值范围--默认调整0.00到99.99范围之间的整数
sb.setMaximum(50) #设置最大值
#maximum() -> int 返回最大值
sb.setMinimum(10.55) #设置最小值
#minimum() -> int 返回最小值
sb.setRange(5.55, 40.55) #设置数值区间
sb.setWrapping(True) #设置是否数值循环
#wrapping() -> bool 返回是否数值循环
sb.setSingleStep(1.01) #设置步长
#singleStep() -> int 返回步长
sb.setPrefix("周") #设置前缀
#prefix() -> str 返回前缀
sb.setSuffix("月") #设置后缀
#suffix() -> str 返回后缀
sb.setSpecialValueText('最小值') #当数据到达最小值时, 会显示此字符串
def B(self,i):
print('值改变了',i)
pass
def A(self):
self.sb.setValue(20.55) # 设置值
s = self.sb.value() # 返回值--十进制-不包括前缀后缀
s=self.sb.cleanText() #获取编辑框的内容--文本格式
print('文本格式获取',s)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec_())
天子骄龙