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鍵、切換焦點、點擊右鍵,關閉程序