GUI學習之二十一——QSlider、QScroll、QDial學習總結


上一章我們學習了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_())
QSlider案例

因為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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM