上一章我們學習了QAbstractSlider的用法,在講功能的時候我們是借助了它的子類QSlider來實現的,今天來學習一下它的三個子類——QSlider、QScroll和QDial。
一.QSlider控件
QSlider的信號全繼承自其父類,還有幾個自身的功能
1.標尺位置
QSlider.setTickPosition(self, position: 'QSlider.TickPosition') #標尺設置 QSlider.tickPosition() #標尺位置獲取——>int # type: 'QSlider.TickPosition' #標尺位置枚舉值 NoTicks = ... # 0——無刻度 TicksAbove = ... # 1——在水平的滑塊上方(豎直布局在左側) TicksLeft = ... # 1水平上方,數值左側 TicksBelow = ... # 2——水平下方,豎直右側 TicksRight = ... # 2——水平下方,豎直右側 TicksBothSides = ... # 3——兩側
2.標尺密度間隔
這個間隔是實際值的間隔,而不是像素值。比方說范圍是0-100,如果間隔設為20則每20畫一個標尺線。
QSlider.setTickInterval(self, ti: int) #設定標尺間隔 QSlider.tickInterval() #獲取標尺間隔
3.案例
基於QSlider我們做一個案例分析,要實現下面的效果
※在滑動的過程中有標簽來顯示當前的值
※標簽位置在滑塊上並且始終隨着滑塊的滑動

from PyQt5.Qt import * from PyQt5 import QtGui import sys class MySlider(QSlider): def __init__(self,parent = None,*args,**kwargs): super().__init__(parent,*args,**kwargs) self.setup_UI() def setup_UI(self): self.label = QLabel('0',self) self.label.hide() def mousePressEvent(self, ev: QtGui.QMouseEvent): super().mousePressEvent(ev) #增加功能 x = (self.width()-self.label.width())/2 y = (1-self.value()/(self.maximum()-self.minimum()))*(self.height()-self.label.height()) self.label.move(x,y) self.label.show() self.label.setText(str(self.value())) def mouseMoveEvent(self, ev: QtGui.QMouseEvent): super().mouseMoveEvent(ev) x = (self.width() - self.label.width()) / 2 y = (1 - self.value() / (self.maximum() - self.minimum())) * (self.height() - self.label.height()) self.label.move(x,y) self.label.show() self.label.setText(str(self.value())) self.label.adjustSize() def mouseReleaseEvent(self, ev: QtGui.QMouseEvent): super().mouseReleaseEvent(ev) self.label.hide() class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): self.resize(500,300) slider = MySlider(self) label = QLabel('0',self) slider.move(50,50) pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
因為label要隨着滑塊的位置的變化而變化,所以難點就是在於對滑塊位置的判定。
x的值就可以看作slider控件的中心位置,就是用slider的寬度減去label的寬度再除以2就可以了
而y的值就比較麻煩,
就是說
label.y()/self.height() = (self.maximum()-self.value())/(self.maximum()-self.minimum()
但是這樣還有些差距,因為我們沒有考慮到標簽自身的高度,所以要修改一下
label.y()/(self.height()-label.heitht()) = (self.maximum()-self.value())/(self.maximum()-self.minimum()
簡化一下就是有這么個關系
y = (1-self.value()/(self.maximum()-self.minimum()))*(self.height()-self.label.height())
二.QScrollBar控件
1.描述
QScrollBar一般很少單獨使用,都是和QAbstractScrollArea一同使用來對界面進行滾動操作。它通常包括四個單獨的控件:一個滑塊、兩個滾動箭頭和頁面控件
它的作用功能都是繼承自QAbstractSlider的
2.創建
QScrollBar的創建分為水平滾動條和垂直滾動條,是在實例化的時候直接聲明的
QScrollBar(Qt.Horizontal,self) #水平 QScrollBar(Qt.Vertical,self) #垂直
3.滾動條的長度
滾動條的長度是可以手動設置的,它有這么個關系
所以改變PageStep()的值就可以改變滾動塊的大小。
三.QDial控件
QDial控件的外觀和滾動塊的不大一樣,是一個旋鈕
但是作用效果和滑塊差不多,都是改變數值用的。除了繼承父類的功能,它有些自己的API
1.刻度顯示
QDial.setNotchesVisible(self, visible: bool) #顯示刻度 QDial.notchesVisible() #獲取是否顯示刻度——>bool
控件的刻度分為大刻度和小刻度。一個大刻度就是一個PageStep移動的值。
注意細節,和控件接觸的就是大刻度,兩個大刻度之間被小刻度等分。
2.包裹
在最大值和最小值之間是有一段空白的(就像上個圖里的一樣),如果想要一個360°無死角都有刻度的就要用到包裹設置了
QDial.setWrapping(self, on: bool) #設置是否包裹 QDial.wrapping() #獲取是否設置包裹——>bool
啟用包裹后的效果就是這樣了
圖里所示旋鈕所在位置就是0。
3.刻度間隙
QDial.setNotchTarget(self, target: float) #設置刻度之間的像素數 QDial.notchTarget() #獲取刻度之間的像素數——>float