PyQt5_QAbstractSpinBox_步长调节器基类

目录

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_())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值