数字输入控件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 例子
# -*- 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 例子
# -*- 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())