QSpinBox-微調框
QSpinBox類提供了一個微調框小部件。
QSpinBox被設計為處理整數和離散值集合(例如,月份名稱);使用QDoubleSpinBox 可以作為浮點數的調整。
QSpinBox允許用戶通過點擊上/下按鈕或按下鍵盤上的/下來選擇一個值來增加/減少當前顯示的值。用戶也可以手動輸入值。微調框支持整數值,
但可以用與 validate(),textFromValue()和valueFromText() 擴展為使用不同的字符串。
每次值改變QSpinBox發出兩個valueChanged()信號,一個提供一個int,另一個提供一個QString。 QString重載提供了prefix()和suffix()兩個值。當前值可以通過value()獲取,並通過setValue()設置。
單擊向上/向下按鈕或使用鍵盤的向上和向下箭頭將按照sizeStep()的大小逐步增加或減少當前值。如果你想改變這個行為,你可以重新實現函數stepBy()。
最小值和最大值以及步長可以使用其中一個構造函數來設置,稍后可以使用setMinimum(),setMaximum()和setSingleStep(True)來更改。
大多數微調框是定向的,但是QSpinBox也可以例外,即如果范圍是0-99並且當前值是99,則如果wrapping()被設置為True,則單擊“up”將給出0。如果你想循環行為,使用setWrapping()。
所顯示的值可以預先加上任意字符串,例如表示貨幣或計量單位。
更多詳細的介紹請見官網:QSpinBox Class | Qt Widgets 5.9
QSpinBox小例子
先來看看具體例子的效果吧:
效果如下:

參考:
https://zhuanlan.zhihu.com/p/31372146
完整代碼:
1 from PyQt5.QtWidgets import (QApplication,QWidget,QSlider,QMessageBox,QFormLayout,QPushButton,QSpinBox) 2 from PyQt5.QtCore import Qt,QBasicTimer 3 from PyQt5.QtGui import QPixmap 4 import sys 5 6 class Example(QWidget): 7 def __init__(self): 8 super(Example, self).__init__() 9 self.initUI() 10 11 def initUI(self): 12 self.setGeometry(300,300,300,200) 13 self.setWindowTitle("QSpinBox微調框") 14 formLayout = QFormLayout() 15 self.sb1 = QSpinBox(self) 16 self.sb2 = QSpinBox(self) 17 self.sb3 = QSpinBox(self) 18 self.sld = QSlider(Qt.Horizontal,self) 19 self.sld.setRange(0,150) 20 self.sld.setSingleStep(5) 21 22 self.sb1.setRange(1,100) 23 self.sb1.setSingleStep(5) #設置步長 24 self.sb1.setMinimumSize(50,20) 25 self.sb1.setWrapping(True) #設置最大最小值循環 26 self.sb1.setValue(0) 27 28 self.sb2.setRange(0,150) 29 self.sb2.setSingleStep(5) # 設置步長 30 self.sb2.setWrapping(True) # 設置最大最小值循環 31 self.sb2.setValue(10) 32 self.sb2.setPrefix("正在下載到") #設置字首 33 self.sb2.setSuffix("%,快要下載完成了等等吧!") #設置字尾 34 35 self.sb3.setRange(0,150) 36 self.sb3.setWrapping(True) # 設置最大最小值循環 37 self.sb3.setValue(10) 38 39 formLayout.addRow("普通微調框",self.sb1) 40 formLayout.addRow("加強微調框",self.sb2) 41 formLayout.addRow("超級微調框",self.sb3) 42 formLayout.addRow("進度條控制",self.sld) 43 44 self.sb1.valueChanged.connect(self.slider1_changeValue) 45 self.sb2.valueChanged.connect(self.slider2_changeValue) 46 self.sld.valueChanged.connect(self.spinbox_changeValue) 47 self.setLayout(formLayout) 48 49 def slider1_changeValue(self,value): 50 self.sld.setValue(value) 51 52 def slider2_changeValue(self,value): 53 if value == self.sb2.maximum(): 54 QMessageBox.information(self,"信息提示框!","恭喜!下載完成",QMessageBox.Ok|QMessageBox.Close,QMessageBox.Close) 55 self.sb2.setSuffix("%,終於讓你如願以償了!") 56 elif self.sb2.minimum() < value < self.sb2.maximum(): 57 self.sb2.setSuffix("%,千萬別放棄哦。。。") 58 59 def spinbox_changeValue(self,value): 60 self.sb3.setValue(value) 61 self.sb2.setValue(value) 62 63 if __name__ == '__main__': 64 app = QApplication(sys.argv) 65 ex = Example() 66 ex.show() 67 sys.exit(app.exec_())
這個段代碼實現了三個微調框的效果:
- 普通的微調框:整數的調整
- 加強微調框:整數的調整前后增加任意字符串,同時當微調框的值為最小值的時候會出現特定的字符串
- 自定義微調框
self.sp1 = QSpinBox(self) self.sp2 = QSpinBox(self) self.sp3 = HolyShitBox(self)
新建三個QSpinBox對象,注意第三個,這個是我們自定義的。
self.sp1.setRange(-10, 200) self.sp1.setSingleStep(10) self.sp1.setWrapping(True) self.sp1.setValue(-10)
QSpinBox.setRange(int minimum,int maximum)這個函數能夠便捷設置最小值和最大值。setRange(minimum,maximum)相當於:setMinimum(minimum)和setMaximum(maximum)。
singleStep:int,此屬性保持步驟值,當用戶使用箭頭來改變微調框的值時,該值將被遞增/遞減單步的數量。 默認值是1.設置一個小於0的singleStep值什么也不做。
QSpinBox.setWrapping(),繼承了QAbstractSpinBox的屬性,這個屬性保持微調框是否能循環調整。
QSpinBox.setValue(),顧名思義設置當前微調框的值。
至此第一個普通的微調框已經設置完畢了。
self.sp2.setPrefix("我的帥達到 ") self.sp2.setSuffix(" %,正在充帥中...") self.sp2.setSpecialValueText('我的帥達到渣的一逼')
QSpinBox.setRange.setPrefix()和QSpinBox.setRange.setSuffix()分別用於設置微調框的前后綴,典型的用法是顯示度量單位或貨幣符號。如下圖:

selfs .sp2.setSpecialValueText('我的帥達到渣的一逼')
該屬性包含特殊值的文本,如果設置,當當前值等於minimum()時,微調框將顯示該文本而不是數字值。典型的用法是表明這個選擇有一個特殊的(默認)含義。
例如,如果您的微調框允許用戶選擇顯示圖像的比例因子(或縮放級別),並且您的應用程序可以自動選擇一個可以使圖像完全適合顯示窗口的圖像,則可以設置像這樣的微調框:
zoomSpinBox = QSpinBox(self) zoomSpinBox.setRange(0, 1000) zoomSpinBox.etSingleStep(10) zoomSpinBox.setSuffix("%") zoomSpinBox.setSpecialValueText("Automatic") zoomSpinBox.setValue(100)
用戶將能夠選擇從1%到1000%的比例,或者選擇“自動”以將其留給應用程序選擇。 然后,您的代碼必須將微調框值0解釋為來自用戶的請求,以縮放圖像以適合窗口內部。
def slider1_changevalue(self,value): self.sl.setValue(value)def spinbox_changevalue(self,value): self.sp1.setValue(value)
這段代碼就是表示滑塊和微調框聯動了。
現在,我們再來介紹一下我們自定義的微調框。
子類化QSpinBox
如果使用prefix(),suffix()和specialValueText()感覺還是不爽,那么你可以繼承QSpinBox並重新實現valueFromText()和textFromValue()。
class HolyShitBox(QSpinBox): def valueFromText(self,str): regExp = QRegExp("(\\d+)(\\s*[xx]\\s*\\d+)?") if regExp.exactMatch(str): return int(regExp.cap(1)) else: return 0 def textFromValue(self,num): return "{0} x {1}".format(num,num) regExp = QRegExp("(\\d+)(\\s*[xx]\\s*\\d+)?")
這里我們首先使用創建一個正則表達式的對象:\s 匹配任意的空白符,\d 匹配數字 ,\\表示轉義\。
關於QRegExp詳解請見:QRegExp Class | Qt Core 5.9
if regExp.exactMatch(str): return int(regExp.cap(1)) else: return 0
要是找了匹配的字符床,返回由第n個子表達式捕獲的文本。cap()匹配的元素的順序如下。第一個元素cap(0)是整個匹配的字符串。cap(1)是第一個捕獲括號的文本,cap(2)是第二個文本,依此類推。明顯我們這里是想匹配“\d+”,然后將其轉換成數字。
def textFromValue(self,num): return "{0} x {1}".format(num,num)
這里就是重寫textFromValue()函數,顯示成“數字 x 數字”的形式。
