上一章我们学习了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我们做一个案例分析,要实现下面的效果

※在滑动的过程中有标签来显示当前的值

※标签位置在滑块上并且始终随着滑块的滑动

GUI学习之二十一——QSlider、QScroll、QDial学习总结

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案例

相关文章: