41- 输入和显示- 数字输入控件QSpinBox和QDoubleSpinBox

数字输入控件QSpinBox和QDoubleSpinBox

QSpinBox 和QDoubleSpinBox 控件是专门用于输入数值的控件,前者只能输人整数后者只能输人浮点数,在右边可以有按钮,也可以没有。

QSpinBox和 QDoubleSpinBox 控件是 QLineEdit 控件和按钮控件组合而来的。

这两个控件都继承自抽象类 QAbstractSpinBox,它们的方法信号和槽函数基本一致。

用QSpinBox和 QDoubleSpinBox 实例化对象的方法如下所示,其中 parent 是控件所在的父窗口或容器控件。

from PySide6.QtWidgets import QSpinBox,QDoubleSpinBox

QSpinBox(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None 
QDoubleSpinBox(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None

数字输入控件QSpinBox和QDoubleSpinBox 的常用方法

数字输人控件 QSpinBox和 QDoubleSpinBox 的常用方法如表所示,主要方法介绍如下:

  • 可以设置允许输入的最小值和最大值
    • 通过 setMinimum()setMaximum()和setRange()方法来设置允许输入的最小值和最大值。
  • QSpinBox和QDoubleSpinBox 控件都提供一个微调控件,通过单击向上/向下按钮或按键盘的↑/↓键来增加/减少当前显示的值。
    • 用setSingleStep()方法可以设置每次增加或减少的微调量,
    • 用setWrapping(True)方法可以设置到达最大或最小值时是否进行循环。
  • QDoubleSpinBox的默认精度是2位小数,
    • 可以通过 setDecimals(int)方法设置允许输人的小数的位数。
  • 用setPrefix(str)和setSuffix(str)方法分别可以设置前缀符号和后缀符号,例如货币或计量单位。
  • 值可以用setValue(int)方法来设置,
    • 当前值可以用value()方法获取,
    • 文本可以用text()方法(包括前缀和后缀)或者 cleanText()方法(没有前缀和后缀)来获取。
    • 按钮的样式可以用setButtonSymbols(QAbstractSpinBox ButtonSymbols)方法设置,枚举类型参数QAbstractSpinBox ButtonSymbols可以取:
      • QAbstractSpinBox.UpDownArrows
      • QAbstractSpinBox.PlusMinus
      • QAbstractSpinBox.NoButtons。
  • 用setCorrectionMode(QAbstractSpinBox,CorrectionMode)方法设置当输人有误时使用自动修正模式参数可取:
    • QAbstractSpinBoxCorrectToPreviousValue(修正成最近正确的值)
    • QAbstractSpinBoxCorrectToNearestValue(修正成最接近正确的值)
  • setKeyboardTracking(bool)方法设置是否可以跟踪按键输入
    • 例如要输人 123,在setKeyboardTracking(True)时,会发送3信号valueChanged()andtextChanged(),信号传递的值分别是 112和123;
    • setKeyboardTracking(False)时,只发送最后的值 123。
QSpinBox和 QDoubleSpinBox的方法及参数类型说 明
[slot]setValue(int)设置当前的值,用于QSpinBox控件
[slot]setValue(float)设置当前的值,用于QDoubleSpinBox控件
value()获取当前的值
setDisplayIntegerBase(int)设置整数的进位值,例如2、8、16,默认为10
displayIntegerBase()获取整数的进位值,仅用于QSpinBox控件
setDecimals(int)设置允许的小数位数,用于QDoubleSpinBox控件
decimals()获取允许的小数位数,用于QDoubleSpinBox控件
setMaximum(inb)、setMaximum(float)设置允许输人的最大值
setMinimum(int)、setMinimum(float)设置允许输入的最小值
setRange(int,int),setRangel(float,float)设置允许输入的最小值和最大值
minimum()、maximum()获取允许的最小值和最大值
selSingleStep(int),setSingleStep(float)设置微调步长
singleStep().获取微调值
setPrefix(str)设置前缀符号,例如’¥
setSuffix(str)设置后缀符号,例如’km
cleanText()获取不含前缀和后缀的文本
text()获取含前缀和后缀的文本
[slot]selectA11()选择显示的值,不包括前级和后级
setAlignment(Qt.Alignment)设置对齐方式
setButonSymbols(QAbstractSpinBox BurtonSymbols)设置右侧的按钮样式
selCorrectionMode(QAbstractSpinBoxCarrectionMode设置自动修正模式
setFrame(bool)设置是否有外边框
setGroupSeparatorShown(bool)设置按照千位(3位)用逗号隔开
setKeyboardTracking(bool)设置是否跟踪键盘的每次输入
setReadOnly(bool)设置只读,不能编辑
setSpecialValueText(str)设置特殊文本,当显示的值等于允许的最小值时,显 示该文本
setWrapping(bool)设置是否可以循环,即最大值后再增大则变成最小 值,最小值后再减小则变成最大值
setAccelerated(bool)当按住增大和减小按钮时,是否加速显示值
[slot]clear()清空内容,不包含前缀和后缀
[slot]stepDown()增大值
[slot]stepUp()减小值

数字输入控件 QSpinBox和 QDoubleSpinBox的信号

数字输人控件 QSpinBox 和 QDoubleSpinBox 的信号相同,如表所示。

当QSpinBox和QDoubleSpinBox 的值发生改变时,都会发送重载型信号 valueChanged()其中一个带int(或 float)类型参数,另一个带 str 类型参数str 类型的参数包含前缀和后缀

信号及参数类型说 明
editingFinished()输人完成,按Enter键或失去焦点时发送信号
textChanged(str)文本发生变化时发送信号
valueChanged(int)数值发生变化时发送信号,用于 QSpinBox控件
valueChanged(float)数值发生变化时发送信号,用于QDoubleSpinBox控件

QSpinBox 例子

image-20230319024625583

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/15 0:57
# File_name: 05-QSpinBox 例子.py


import sys
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *


class spindemo(QWidget):
    def __init__(self,parent=None):
        super(spindemo,self).__init__(parent)
        self.setWindowTitle("SpinBox 例子")
        self.resize(300,100)

        layout = QFormLayout()

        self.label = QLabel("current value:")
        # self.label.setAlignment(Qt.AlignCenter)
        self.label.setAlignment(Qt.AlignLeft)
        layout.addWidget(self.label)

        self.spinbox = QSpinBox()
        layout.addRow(QLabel('默认显示'),self.spinbox)
        self.spinbox.valueChanged.connect(lambda: self.on_valuechange(self.spinbox))

        label = QLabel("步长和范围:")
        self.spinbox_int = QSpinBox()
        self.spinbox_int.setRange(-20,20)
        self.spinbox_int.setMinimum(-10)
        self.spinbox_int.setSingleStep(2)
        self.spinbox_int.setValue(0)
        layout.addRow(label,self.spinbox_int)
        self.spinbox_int.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_int))

        label = QLabel("循环:")
        self.spinbox_wrap = QSpinBox()
        self.spinbox_wrap.setRange(-20,20)
        self.spinbox_wrap.setSingleStep(5)
        self.spinbox_wrap.setWrapping(True)
        layout.addRow(label,self.spinbox_wrap)
        self.spinbox_wrap.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_wrap))

        label = QLabel("前后缀")
        self.spinbox_price = QSpinBox()
        self.spinbox_price.setRange(0,999)
        self.spinbox_price.setSingleStep(1)
        self.spinbox_price.setPrefix("¥")
        self.spinbox_price.setSuffix("/每个")
        self.spinbox_price.setValue(99)
        layout.addRow(label,self.spinbox_price)
        self.spinbox_price.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_price))

        self.groupSeparatorSpinBox = QSpinBox()
        self.groupSeparatorSpinBox.setRange(-99999999,99999999)
        self.groupSeparatorSpinBox.setValue(1000)
        self.groupSeparatorSpinBox.setGroupSeparatorShown(True)
        groupSeparatorChkBox = QCheckBox()
        groupSeparatorChkBox.setText("千分隔符:")
        groupSeparatorChkBox.setChecked(True)
        layout.addRow(groupSeparatorChkBox,self.groupSeparatorSpinBox)
        groupSeparatorChkBox.toggled.connect(self.groupSeparatorSpinBox.setGroupSeparatorShown)
        self.groupSeparatorSpinBox.valueChanged.connect(lambda: self.on_valuechange(self.groupSeparatorSpinBox))

        label = QLabel("特殊文本:")
        self.spinbox_zoom = QSpinBox()
        self.spinbox_zoom.setRange(0,1000)
        self.spinbox_zoom.setSingleStep(10)
        self.spinbox_zoom.setSuffix("%")
        self.spinbox_zoom.setSpecialValueText("Automatic")
        self.spinbox_zoom.setValue(100)
        layout.addRow(label,self.spinbox_zoom)
        self.spinbox_zoom.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_zoom))

        self.setLayout(layout)

    def on_valuechange(self,spinbox):
        self.label.setText("current value:"+ str(spinbox.value()))


if __name__ =='__main__':
    app = QApplication(sys.argv)
    ex = spindemo()
    ex.show()
    sys.exit(app.exec())

QDoubleSpinBox 例子

image-20230319024716332

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/15 0:49
# File_name: 02-QDoubleSpinBox 例子.py


import sys
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *


class spindemo(QWidget):
    def __init__(self,parent=None):
        super(spindemo,self).__init__(parent)
        self.setWindowTitle("SpinBox 例子")
        self.resize(300,100)

        layout = QFormLayout()

        self.label = QLabel("current value:")
        # self.label.setAlignment(Qt.AlignCenter)
        self.label.setAlignment(Qt.AlignLeft)
        layout.addWidget(self.label)

        self.spinbox = QDoubleSpinBox()
        layout.addRow(QLabel('默认显示'),self.spinbox)
        self.spinbox.valueChanged.connect(lambda: self.on_valuechange(self.spinbox))

        self.spinbox_decimal = QDoubleSpinBox()
        self.spinbox_decimal.setDecimals(4)
        layout.addRow(QLabel('显示4位小数'),self.spinbox_decimal)
        self.spinbox_decimal.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_decimal))

        label = QLabel("步长和范围:")
        self.spinbox_int = QDoubleSpinBox()
        self.spinbox_int.setRange(-20,20)
        self.spinbox_int.setMinimum(-10)
        self.spinbox_int.setSingleStep(2)
        self.spinbox_int.setValue(0)
        layout.addRow(label,self.spinbox_int)
        self.spinbox_int.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_int))

        label = QLabel("循环:")
        self.spinbox_wrap = QDoubleSpinBox()
        self.spinbox_wrap.setRange(-20,20)
        self.spinbox_wrap.setSingleStep(5)
        self.spinbox_wrap.setWrapping(True)
        layout.addRow(label,self.spinbox_wrap)
        self.spinbox_wrap.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_wrap))

        label = QLabel("前后缀")
        self.spinbox_price = QDoubleSpinBox()
        self.spinbox_price.setRange(0,999)
        self.spinbox_price.setSingleStep(1)
        self.spinbox_price.setPrefix("¥")
        self.spinbox_price.setSuffix("/每个")
        self.spinbox_price.setValue(99)
        layout.addRow(label,self.spinbox_price)
        self.spinbox_price.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_price))

        self.groupSeparatorSpinBox = QDoubleSpinBox()
        self.groupSeparatorSpinBox.setRange(-99999999,99999999)
        self.groupSeparatorSpinBox.setValue(1000)
        self.groupSeparatorSpinBox.setGroupSeparatorShown(True)
        groupSeparatorChkBox = QCheckBox()
        groupSeparatorChkBox.setText("千分隔符:")
        groupSeparatorChkBox.setChecked(True)
        layout.addRow(groupSeparatorChkBox,self.groupSeparatorSpinBox)
        groupSeparatorChkBox.toggled.connect(self.groupSeparatorSpinBox.setGroupSeparatorShown)
        self.groupSeparatorSpinBox.valueChanged.connect(lambda: self.on_valuechange(self.groupSeparatorSpinBox))

        label = QLabel("特殊文本:")
        self.spinbox_zoom = QDoubleSpinBox()
        self.spinbox_zoom.setRange(0,1000)
        self.spinbox_zoom.setSingleStep(10)
        self.spinbox_zoom.setSuffix("%")
        self.spinbox_zoom.setSpecialValueText("Automatic")
        self.spinbox_zoom.setValue(100)
        layout.addRow(label,self.spinbox_zoom)
        self.spinbox_zoom.valueChanged.connect(lambda: self.on_valuechange(self.spinbox_zoom))

        self.setLayout(layout)

    def on_valuechange(self,spinbox):
        self.label.setText("current value:"+ str(spinbox.value()))


if __name__ =='__main__':
    app = QApplication(sys.argv)
    ex = spindemo()
    ex.show()
    sys.exit(app.exec())

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值