ZetCode

PyQt QSlider

最后修改于 2023 年 8 月 24 日

在本文中,我们将展示如何使用 QSlider 部件。

访问 Advanced PyQt5 电子书,阅读 PyQt6 教程,或列出所有 PyQt 教程

PyQt QSlider

QSlider 是一个用于控制有界值的部件。滑块可以是水平的,也可以是垂直的。用户通过移动滑块来选择值。

可能值的范围通过 setMinimumsetMaximumsetRange 来指定。此外,还可以选择显示刻度线。

当滑块的值发生变化时,会发出 valueChanged 信号。

QSlider 水平滑块示例

在下面的示例中,我们创建一个水平滑块。

horizontal.py
#!/usr/bin/python

from PyQt6.QtWidgets import (QWidget, QSlider, QHBoxLayout,
                             QLabel, QApplication)
from PyQt6.QtCore import Qt
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        sld = QSlider(Qt.Orientation.Horizontal, self)
        sld.setRange(0, 100)
        sld.setPageStep(5)

        sld.valueChanged.connect(self.updateLabel)

        self.label = QLabel('0', self)
        self.label.setAlignment(Qt.AlignmentFlag.AlignCenter |
                                Qt.AlignmentFlag.AlignVCenter)
        self.label.setMinimumWidth(80)

        hbox.addWidget(sld)
        hbox.addSpacing(15)
        hbox.addWidget(self.label)

        self.setLayout(hbox)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QSlider')
        self.show()

    def updateLabel(self, value):

        self.label.setText(str(value))


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

通过移动滑块的滑块,我们改变相邻标签中显示的值。

sld = QSlider(Qt.Orientation.Horizontal, self)
sld.setRange(0, 100)

这里创建了一个水平滑块。其值范围通过 setRange 设置。

sld.setPageStep(5)

页面步长是一个较大的步长,通过 PageUp 或 PageDown 键,或者通过在滑块外单击滑块条来执行。

sld.valueChanged.connect(self.updateLabel)

我们将 self.updateLabel 处理程序连接到 valueChanged 信号。

self.label = QLabel('0', self)
self.label.setAlignment(Qt.AlignmentFlag.AlignCenter |
                        Qt.AlignmentFlag.AlignVCenter)
self.label.setMinimumWidth(80)

我们为标签设置了最小尺寸,以防止在重绘标签时滑块调整大小。

def updateLabel(self, value):

    self.label.setText(str(value))

updateLabel 处理程序中,我们将标签的文本更新为新选择的 QSlider 值。

Horizontal QSlider
图:水平 QSlider

垂直 QSlider

下一个示例展示了一个垂直滑块。

vertical.py
#!/usr/bin/python

from PyQt6.QtWidgets import (QWidget, QSlider, QHBoxLayout,
                             QLabel, QApplication)
from PyQt6.QtCore import Qt
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        sld = QSlider(Qt.Orientation.Vertical, self)
        sld.setRange(0, 100)
        sld.setPageStep(5)

        sld.valueChanged.connect(self.changeValue)

        self.label = QLabel("0", self)
        self.label.setStyleSheet(
            'QLabel { background: #007AA5; border-radius: 3px;}')
        self.label.setAlignment(Qt.AlignmentFlag.AlignCenter |
                                Qt.AlignmentFlag.AlignVCenter)
        self.label.setMinimumWidth(80)

        hbox.addStretch()
        hbox.addWidget(sld)
        hbox.addSpacing(15)
        hbox.addWidget(self.label)
        hbox.addStretch()

        self.setLayout(hbox)

        self.setGeometry(300, 300, 350, 250)
        self.setWindowTitle('QSlider')
        self.show()

    def changeValue(self, value):

        self.label.setText(str(value))


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

要创建一个垂直滑块,我们将 Qt.Orientation.Vertical 传递给 QSlider 的构造函数。

self.label = QLabel('0', self)
self.label.setStyleSheet(
    'QLabel { background: #007AA5; border-radius: 3px;}')

我们通过设置标签的样式表来创建一个漂亮的圆角矩形。

Vertical QSlider
图:垂直 QSlider

QSlider 音量控制

以下示例展示了如何使用滑块来管理音量控制。

volume_control.py
#!/usr/bin/python

from PyQt6.QtWidgets import (QWidget, QSlider, QHBoxLayout,
                             QLabel, QApplication)
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QPixmap
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        sld = QSlider(Qt.Orientation.Horizontal, self)
        sld.valueChanged.connect(self.changeValue)

        self.label = QLabel(self)
        self.label.setPixmap(QPixmap('mute.png'))

        hbox.addWidget(sld)
        hbox.addSpacing(40)
        hbox.addWidget(self.label)

        self.setLayout(hbox)

        self.setGeometry(400, 300, 350, 200)
        self.setWindowTitle('Volume control')
        self.show()

    def changeValue(self, value):

        if value == 0:

            self.label.setPixmap(QPixmap('mute.png'))
        elif 0 < value <= 30:

            self.label.setPixmap(QPixmap('min.png'))
        elif 30 < value < 80:

            self.label.setPixmap(QPixmap('med.png'))
        else:

            self.label.setPixmap(QPixmap('max.png'))


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

在我们的示例中,我们模拟了一个音量控制。通过拖动滑块的滑块,我们改变标签上的图像。

self.label = QLabel(self)
self.label.setPixmap(QPixmap('mute.png'))

我们创建一个 QLabel 部件,并为其设置一个初始的静音图像。

sld.valueChanged.connect(self.changeValue)

我们将 valueChanged 信号连接到用户自定义的 changeValue 方法。

if value == 0:
    self.label.setPixmap(QPixmap('mute.png'))
...

根据滑块的值,我们为标签设置一个图像。在上面的代码中,如果滑块的值等于零,我们将 mute.png 图像设置给标签。

QSlider volume control
图:QSlider 音量控制

在本文中,我们介绍了 PyQt 的 QSlider 部件。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写超过 1400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 PyQt 教程