PyQt5 – QSlider Widget & Signal

  • Post category:Python

首先,QSlider是PyQt5中的一个滑动条控件,常用于调整数值范围。

创建QSlider控件

通过以下代码以创建一个水平方向的滑动条:

from PyQt5.QtWidgets import QApplication, QSlider, QMainWindow

app = QApplication([])
main_win = QMainWindow()
slider = QSlider(main_win)
slider.setOrientation(Qt.Horizontal) # 设置方向为水平

main_win.show()
app.exec_()

设置QSlider的取值范围

QSlider的范围可以通过setRange方法来设置:

slider.setRange(min_val, max_val)

例如:

slider.setRange(0, 100)

设置QSlider的步长

可以通过setSingleStep方法设置QSlider步长:

slider.setSingleStep(step)

例如:

slider.setSingleStep(1)

接收QSlider的值变化信号

QSlider提供了valueChanged信号,来通知控件的值改变了:

slider.valueChanged.connect(function_to_handle_event)

例如,以下代码将QSlider的值和标签绑定在一起:

from PyQt5.QtWidgets import QApplication, QSlider, QLabel, QVBoxLayout, QWidget

app = QApplication([])
main_win = QWidget()
layout = QVBoxLayout()
slider = QSlider()
label = QLabel("0")

layout.addWidget(slider)
layout.addWidget(label)
main_win.setLayout(layout)

slider.valueChanged.connect(lambda: label.setText(str(slider.value())))

main_win.show()
app.exec_()

此时,当滑动条的值改变时,标签内容也会跟随改变。

设置QSlider为不透明背景

可以通过设置QSlider的setStyleSheet方法来设置控件为不透明的背景:

slider.setStyleSheet("background-color: #ffffff;") # 设置为白色背景

附加示例

下面我们来看一下两个更加全面的应用示例:

示例一:音量调节控件

from PyQt5.QtWidgets import QApplication, QSlider, QLabel, QVBoxLayout, QWidget

app = QApplication([])
main_win = QWidget()
layout = QVBoxLayout()
slider = QSlider()
slider.setOrientation(Qt.Vertical) # 垂直方向
slider.setRange(0, 100) # 范围
slider.setSingleStep(1) # 步长
slider.setTickPosition(QSlider.TicksRight) # 右侧显示刻度
label = QLabel("0")

layout.addWidget(slider)
layout.addWidget(label)
main_win.setLayout(layout)

slider.valueChanged.connect(lambda: label.setText(str(slider.value())))

main_win.show()
app.exec_()

此示例就是一个音量控制的滑动条,你可以通过滑动条来调节音量大小,并且会在标签上显示当前调节的数值。

示例二:球形游戏中的难度选择

from PyQt5.QtWidgets import QApplication, QSlider, QPushButton, QHBoxLayout, QVBoxLayout, QWidget

app = QApplication([])
main_win = QWidget()
layout = QVBoxLayout()

diff_label = QLabel("选择难度:")
layout.addWidget(diff_label)

diff_btns = QWidget()
diff_layout = QHBoxLayout()
diff_slow = QPushButton("慢")
diff_medium = QPushButton("中等")
diff_fast = QPushButton("快")

diff_layout.addWidget(diff_slow)
diff_layout.addWidget(diff_medium)
diff_layout.addWidget(diff_fast)

diff_btns.setLayout(diff_layout)
layout.addWidget(diff_btns)

slider_label = QLabel("选择难度大小")
layout.addWidget(slider_label)

slider = QSlider(Qt.Horizontal)
slider.setRange(0, 2)
slider.setSingleStep(1)
slider.setTickPosition(QSlider.TicksBothSides)
slider.setStyleSheet("background-color: #ffffff;")
layout.addWidget(slider)

main_win.setLayout(layout)

slider_label.setText("选择难度大小:" + ["慢", "中等", "快"][slider.value()])

def on_diff_changed(diff):
    slider_label.setText("选择难度大小:" + diff)

diff_slow.clicked.connect(lambda: on_diff_changed("慢"))
diff_medium.clicked.connect(lambda: on_diff_changed("中等"))
diff_fast.clicked.connect(lambda: on_diff_changed("快"))

slider.valueChanged.connect(lambda: on_diff_changed(["慢", "中等", "快"][slider.value()]))

main_win.show()
app.exec_()

此示例模拟了一个球形游戏中的难度选择,你可以通过按钮来选择难度级别,也可以通过滑动条来进一步调节难度大小。