QAbstractSpinBox是一个抽象类,是将所有步长调节器的通用的功能抽象出了一个父类。虽然QAbstractSpinBox是一个抽象类,但是可以直接实例化使用。QAbstractSpinBox包含了一个QLineEdit和两个QPushbutton。数据的更改可以通过点击按钮或使用键盘输入。
由于QAbstractSpinBox是个基类,没有对按钮的事件进行定义,控件中的按钮点击是没有效果的,想要有效果需要对类进行重写
from PyQt5.Qt import * import sys class MyASB(QAbstractSpinBox): def stepEnabled(self): current = int(self.text()) if current == 0: return QAbstractSpinBox.StepUpEnabled elif current == 9999: return QAbstractSpinBox.StepDownEnabled elif current<0 or current>9999: return QAbstractSpinBox.StepNone else: return QAbstractSpinBox.StepUpEnabled| QAbstractSpinBox.StepDownEnabled def stepBy(self, steps: int): current =int(self.text()) self.lineEdit().setText(str(steps+current)) class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): asb = MyASB(self) asb.move(100,100) asb.resize(200,40) asb.setAccelerated(True) pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
这样就能实现用按钮在0-9999之间加减,超出范围是没有效果的
在后面的演示中为了方便我们都用上面的子类来演示(数值变化范围0-9999)。
1.长按按钮累计加速
在默认情况下使用按钮对数据进行累计时数据是匀速变化的,还可以使它加速变化
QAbstractSpinBox.setAccelerated(True)
QAbstractSpinBox.isAccelerated()
2.只读设置
这个只读是用户不能使用键盘输入数据,但是可以用鼠标点击按钮来实现数据的更改。
QAbstractSpinBox.setReadOnly(True)
QAbstractSpinBox.isReadOnly()
3.内容设置和获取
QAbstractSpinBox里面包含了一个QLineEdit控件,可以直接获取这个LineEdit对象
QAbstractSpinBox.lineEdit()
这样就可以用QLineEdit里的方法对数据进行获取或修改
QAbstractSpinBox.lineEdit().setText('str') QAbstractSpinBox.lineEdit().text()
其实QLineEdit里的很多功能(对齐、自动填充、验证器)都可以使用
但是因为我们常常需要从控件中获取数据,QAbstractSpinBox给我们留了一个直接的API
QAbstractSpinBox.text()
可以直接获取数据。
4.对齐方式
QAbstractSpinBox.setAlignment(Qt.AlignCenter)
AlignLeft = ... # type: 'Qt.AlignmentFlag' AlignLeading = ... # type: 'Qt.AlignmentFlag' AlignRight = ... # type: 'Qt.AlignmentFlag' AlignTrailing = ... # type: 'Qt.AlignmentFlag' AlignHCenter = ... # type: 'Qt.AlignmentFlag' AlignJustify = ... # type: 'Qt.AlignmentFlag' AlignAbsolute = ... # type: 'Qt.AlignmentFlag' AlignHorizontal_Mask = ... # type: 'Qt.AlignmentFlag' AlignTop = ... # type: 'Qt.AlignmentFlag' AlignBottom = ... # type: 'Qt.AlignmentFlag' AlignVCenter = ... # type: 'Qt.AlignmentFlag' AlignVertical_Mask = ... # type: 'Qt.AlignmentFlag' AlignCenter = ... # type: 'Qt.AlignmentFlag' AlignBaseline = ... # type: 'Qt.AlignmentFlag'
5.边框显示
QAbstractSpinBox控件默认有边框的
右边的图就是默认情况,带有边框,也可以不显示边框
QAbstractSpinBox.setFrame(False)
6.按钮的样式
还可以对按钮的样式进行修改
QAbstractSpinBox.setButtonSymbols(QAbstractSpinBox.NoButtons)
UpDownArrows = ... # type: 'QAbstractSpinBox.ButtonSymbols' PlusMinus = ... # type: 'QAbstractSpinBox.ButtonSymbols' NoButtons = ... # type: 'QAbstractSpinBox.ButtonSymbols'
枚举值中有个加减效果,但是我没试出来,不显示倒是可以的。
这里有个小技巧:如果不显示按钮,却又设置了只读模式,那么数据还能改么?可以的!在获取焦点后可以用键盘上下键来修改数据
7.内容验证
首先我们可以用QLineEdit来实现数据的验证,在这里我们讲是QAbstractSpinBox直接给出的API。
其实在一开始的案例我们就定义了一个验证器:数小于0或大于9999时再点击就没效果了,但是这仅限于用鼠标点击增减按钮。可以如果我不用鼠标,用键盘输入数据时是不调用这个方法了,那是不是就失效了!那就需要另外的方法了!但是试验是失败的,回来捋清楚了再说吧
8。信号
只有一个信号要讲
QAbstractSpinBox.editingFinished()
其实就是结束了编辑:按下Enter键、切换焦点、点击右键,关闭程序