PyQt5系列教程(18):微調框1
上期我們學習了進度條的使用(QProgressBar),本期我們介紹一下微調框(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小例子
先來看看具體例子的效果吧:
部分核心代碼如下:
class HolyShitBox(QSpinBox):n def valueFromText(self,str):n regExp = QRegExp("(d+)(s*[xx]s*d+)?")n if regExp.exactMatch(str):n return int(regExp.cap(1))n else:n return 0nn def textFromValue(self,num):n return "{0} x {1}".format(num,num)n n nclass Example(QWidget):n def __init__(self):n super().__init__()n self.initUI()nn def initUI(self):nn self.resize(350,280)n self.setWindowTitle(關注微信公眾號:學點編程吧--微調框)nn lb1 = QLabel(普通微調框,self)n lb2 = QLabel(加強微調框,self)n lb3 = QLabel(超神微調框,self)nn self.sp1 = QSpinBox(self)n self.sp2 = QSpinBox(self)n self.sp3 = HolyShitBox(self)nn self.sl = QSlider(Qt.Horizontal,self) n n #布局代碼省略...nn self.sp1.setRange(-10, 200)n self.sp1.setSingleStep(10)n self.sp1.setWrapping(True)n self.sp1.setValue(-10)nn self.sp2.setRange(0, 100)n self.sp2.setSingleStep(10)n self.sp2.setValue(10)n self.sp2.setPrefix("我的帥達到 ")n self.sp2.setSuffix(" %,正在充帥中...")n self.sp2.setSpecialValueText(我的帥達到渣的一逼)nn self.sp3.setRange(10, 50)n self.sp3.setValue(10)n self.sp3.setWrapping(True)nn self.sl.setRange(-10, 200)n self.sl.setValue(-10)nn self.sp1.valueChanged.connect(self.slider1_changevalue)n self.sp2.valueChanged.connect(self.slider2_changevalue)n self.sl.valueChanged.connect(self.spinbox_changevalue)n self.show()n n def slider1_changevalue(self,value):n self.sl.setValue(value)n n def slider2_changevalue(self,value):n if self.sp2.value() == self.sp2.maximum():n QMessageBox.information(self,提示,你怎麼還再充帥,你不知道你的帥已經引起了別人的嫉妒嗎?)n self.sp2.setSuffix(" %,我踏馬太帥了!!")n elif self.sp2.minimum()< self.sp2.value() < self.sp2.maximum():n self.sp2.setSuffix(" %,正在充帥中...")n n def spinbox_changevalue(self,value):n self.sp1.setValue(value)n
這個段代碼實現了三個微調框的效果:
- 普通的微調框:整數的調整
- 加強微調框:整數的調整前後增加任意字元串,同時當微調框的值為最小值的時候會出現特定的字元串
- 自定義微調框
self.sp1 = QSpinBox(self)nself.sp2 = QSpinBox(self)nself.sp3 = HolyShitBox(self)n
新建三個QSpinBox對象,注意第三個,這個是我們自定義的。
self.sp1.setRange(-10, 200)nself.sp1.setSingleStep(10)nself.sp1.setWrapping(True)nself.sp1.setValue(-10)n
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("我的帥達到 ")nself.sp2.setSuffix(" %,正在充帥中...")nself.sp2.setSpecialValueText(我的帥達到渣的一逼)n
QSpinBox.setRange.setPrefix()和QSpinBox.setRange.setSuffix()分別用於設置微調框的前後綴,典型的用法是顯示度量單位或貨幣符號。如下圖:
self.sp2.setSpecialValueText(我的帥達到渣的一逼)n
該屬性包含特殊值的文本,如果設置,噹噹前值等於minimum()時,微調框將顯示該文本而不是數字值。典型的用法是表明這個選擇有一個特殊的(默認)含義。
例如,如果您的微調框允許用戶選擇顯示圖像的比例因子(或縮放級別),並且您的應用程序可以自動選擇一個可以使圖像完全適合顯示窗口的圖像,則可以設置像這樣的微調框:
zoomSpinBox = QSpinBox(self)nzoomSpinBox.setRange(0, 1000)nzoomSpinBox.etSingleStep(10)nzoomSpinBox.setSuffix("%")nzoomSpinBox.setSpecialValueText("Automatic")nzoomSpinBox.setValue(100)n
用戶將能夠選擇從1%到1000%的比例,或者選擇「自動」以將其留給應用程序選擇。 然後,您的代碼必須將微調框值0解釋為來自用戶的請求,以縮放圖像以適合窗口內部。
def slider1_changevalue(self,value):n self.sl.setValue(value)def spinbox_changevalue(self,value):n self.sp1.setValue(value)n
這段代碼就是表示滑塊和微調框聯動了。
現在,我們再來介紹一下我們自定義的微調框。
子類化QSpinBox
如果使用prefix(),suffix()和specialValueText()感覺還是不爽,那麼你可以繼承QSpinBox並重新實現valueFromText()和textFromValue()。
class HolyShitBox(QSpinBox):
def valueFromText(self,str):n regExp = QRegExp("(d+)(s*[xx]s*d+)?")n if regExp.exactMatch(str):n return int(regExp.cap(1))n else:n return 0nn def textFromValue(self,num):n return "{0} x {1}".format(num,num)n
regExp = QRegExp("(d+)(s*[xx]s*d+)?")n
這裡我們首先使用創建一個正則表達式的對象:s 匹配任意的空白符,d 匹配數字 ,表示轉義。
關於QRegExp詳解請見:QRegExp Class | Qt Core 5.9
if regExp.exactMatch(str):n return int(regExp.cap(1))nelse:n return 0n
要是找了匹配的字元床,返回由第n個子表達式捕獲的文本。cap()匹配的元素的順序如下。第一個元素cap(0)是整個匹配的字元串。cap(1)是第一個捕獲括弧的文本,cap(2)是第二個文本,依此類推。明顯我們這裡是想匹配「d+」,然後將其轉換成數字。
def textFromValue(self,num):n return "{0} x {1}".format(num,num)n
這裡就是重寫textFromValue()函數,顯示成「數字 x 數字」的形式。
最後
ok,今天微調框的介紹暫時就到這裡吧。下期我們再約,把QDoubleSpinBox簡單的再介紹一下,篇幅會短點。
如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送pyqt518,會自動得到相應的百度網盤下載鏈接。
推薦閱讀:
※PyQt5系列教程(21):標籤(QLabel)
※PyQt5系列教程(17):跑馬燈(進度條的使用)
※PyQt5系列教程(7):界面搭建
※Qt桌面開發的困惑?
※PyQt4教程的對話框(QInputDialog)例子里的一段代碼,為什麼要這樣寫?