滚动条控件QScrollBar
滚动条控件QScrollBar 和滑块控件QSlider 用于输人整数通过滚动条和滑块的位置来确定控件输人的值。
滚动条和滑块控件的外观都有水平和竖直两种样式。这两个控件的功能相似,外观有所不同,QScrollBar 两端有箭头而QSlider没有,QSlider可以设置刻度。
用QScrolIBar 和QSlider 创建实例对象的方法如下所示,QScrollBar 类和QSlider 类是从 QAbstraotSlider 类继承而来的。
-
parent是窗口或者容器类控件
-
Qt.Orientation.Orientation (继承枚举。标志) 此类型用于表示对象的方向。
Constant Description Qt.Horizontal 水平 Qt.Vertical 垂直
from PySide6.QtWidgets import QScrollBar
QScrollBar(arg__1: PySide6.QtCore.Qt.Orientation, parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
QScrollBar(parent: Union[PySide6.QtWidgets.QWidget,NoneType]=None)-> None
构造垂直滚动条。父参数被发送到QWidget构造函数.最小值默认为0,最大值为99,单步大小为1,pageStep大小为10,初始值为0。
构造具有给定方向的滚动条。父参数传递给QWidget构造函数。最小值默认为0,最大值为99,单步大小为1,pageStep大小为10,初始值为0。
滚动条控件QScrollBar官方描述
滚动条是一种控件,使用户能够访问文档中比用于显示文档的小部件更大的部分。它提供用户在文档中的当前位置和可见文档数量的视觉指示。滚动条通常配备有其他控件,可以实现更准确的导航。Qt以适合每个平台的方式显示滚动条。
如果您需要在另一个小部件上提供滚动视图,那么使用QScrollArea类可能更方便,因为它提供了视口小部件和滚动条。如果您需要使用QAbstractScrollArea为专用小部件实现类似的功能,那么QScrollBar非常有用;例如,如果您决定对QAbstractItemView进行子类化。对于大多数其他情况,其中滑块控件用于获得给定范围内的值,QSlider类可能更适合您的需要。
滚动条通常包括四个独立的控件:滑块、滚动箭头和页面控件。
- 滑块提供了一种快速转到文档任何部分的方法,但不支持在大型文档中进行精确导航。
- 滚动箭头是可用于精确导航到文档中特定位置的按钮。对于连接到文本编辑器的垂直滚动条,这些滚动条通常将当前位置向上或向下移动一行,并将滑块的位置调整一小部分。在编辑器和列表框中,"行"可能意味着一行文本;在图像查看器中,它可能意味着20个像素。
- 页面控件是拖动滑块的区域滚动条的背景。单击此处将滚动条移向单击一个"页面"。该值通常与滑块的长度相同。
每个滚动条都有一个值,该值指示滑块距离滚动条的起点有多远;这是用value获得的,并用setValue设置。该值始终位于为滚动条定义的值的范围内,从minimum到maximum包括在内。可以使用setMinimum和setMaximum设置可接受值的范围。在最小值时,滑块的上边缘对于垂直滚动条或左边缘对于水平滚动条将位于滚动条的顶端或左端。在最大值时,滑块的下边缘或右边缘将位于滚动条的下端或右端。
滑块的长度通常与页面步长的值有关,通常表示滚动视图中显示的文档区域的比例。页面步长是用户按下page Up和page Down键时值的变化量,由setPageStep设置。使用光标键对行步长定义的值进行较小的更改,并且使用setSingleStep设置此数量。
请注意,所使用的值的范围与滚动条小部件的实际大小无关。在为范围和页面步长选择值时,不需要考虑这一点。
为滚动条指定的值的范围通常与为QSlider指定的值不同,因为需要考虑滑块的长度。如果我们有一个有100行的文档,并且我们在一个小部件中只能显示20行,那么我们可能希望构建一个页面步长为20、最小值为0、最大值为80的滚动条。这将为我们提供一个包含五个"页面"的滚动条。
在许多常见情况下,文档长度、滚动条中使用的值范围和页面步长之间的关系很简单。滚动条的值范围是通过从表示文档长度的某个值中减去选定的页面步长来确定的。在这种情况下,以下公式很有用:文档长度=最大值-最小值+页面步长)。
QScrollBar仅提供整数范围。请注意,尽管QScrollBar处理的数字非常大,但当前屏幕上的滚动条不能有效地表示约100000像素以上的范围。除此之外,用户很难使用键盘或鼠标控制滑块,滚动箭头的使用也会受到限制。
ScrollBar从QAbstractSlider继承了一组全面的信号:
- 当滚动条的值发生更改时,会发出valueChanged。tracking确定该信号是否在用户交互过程中发出。
- 当滚动条的值范围发生变化时,将发出rangeChanged。
- 当用户开始拖动滑块时,会发出sliderPressed。
- 当用户拖动滑块时,会发出sliderMoved。
- 当用户释放滑块时,会发出sliderReleased。
- 当用户交互或通过triggerAction函数更改滚动条时,会发出actionTriggered。
滚动条可以由键盘控制,但它的默认focusPolicy为NoFocus。使用setFocusPolicy启用与滚动条的键盘交互:
- 向左/向右移动水平滚动条一步。
- 向上/向下移动垂直滚动条一步。
- PageUp向上移动一页。
- PageDown向下移动一页。
- 原点移动到起点最小值。
- 末端移动到末端最大值。
滑块本身可以通过使用triggerAction函数来控制,以模拟用户与滚动条控件的交互。如果您有许多不同的小部件使用一个通用的值范围,这将非常有用。
大多数GUI样式使用pageStep值来计算滑块的大小。
滚动条控件QScrollBar方法
QScrollBar和QSlider 都是从 QAbstractSlider类继承而来的,因此它们的多数方法是相同的。
QScrollBar和QSlider 的常用方法如表所示,主要方法介绍如下:
-
滑块的位置和值
- 通过 setMaximum()和setMinium()方法来设置也可以用setRange()方法来设置;
- 滑块的当前值可以通过setValue()和setPosition()方法来设置,通过 value()方法可以获取滑块的当前值
-
步长
-
鼠标或键盘改变
- 可以用鼠标拖动滑块的位置或单击两端的箭头
- 如果焦点在控件上,还可以通过键盘上的左右箭头来控制
- 如果用键盘来移动滑块的位置QScrollBar 控件默认是不获得焦点的,可以通过setFocusPolicy(Qt.FocusPolicy)方法设置其能获得焦点,例如Qt.FocusPolicy 取 QtClickFocus 可以通过单击获得焦点,取QtTabFocus 可以通过按 Tab键获得焦点当设置setTracking()为 False时,用鼠标拖动滑块连续移动时(鼠标按住不松开)控件不发送valueChanged 信号。
- 还可以单击滑块的滑行轨道,或者用键盘上的PageUp和PageDown键来改变值
- 值的增加或减少的步长由setSingleStep()方法来设置
-
移动控件改变
- 在 Windows 系统中光标移动到 slider 上使用滚轮操作时的默认步长是min(3*singleStep;pageStep)。
-
setInvertedControls()方法可以使键盘上的PageUP和PageDown 键的作用反向。
-
-
设置刻度
-
QSlider可以设置刻度,方法是 setTickInterval(int),其中参数int 是刻度间距。
-
用tickInterval()方法可以获取刻度间距值,
-
用setTickPosition(QSliderTickPosition)方法可以设置刻度的位置,
-
用setTickPosition(QSlider.TickPosition)方法设置 QSlider 控件刻度的位置;用tickPosition()方法可以获取刻度位置其中 QSlider.TickPosition可以取以下值。
PySide6.QtWidgets.QSlider.TickPosition 此枚举指定相对于滑块的凹槽和用户移动的控制柄绘制刻度线的位置。
Constant Description QSlider.NoTicks 不要画任何记号。 QSlider.TicksBothSides 在凹槽的两侧画上记号。 QSlider.TicksAbove 在水平滑块上方绘制刻度线 QSlider.TicksBelow 在水平滑块下方绘制刻度线 QSlider.TicksLeft 在垂直滑块的左侧绘制刻度线 QSlider.TicksRight 在垂直滑块的右侧绘制刻度线
-
QScrollBar方法及参数类型 | 说 明 |
---|---|
[slot]setOrientation(Qt.Orientation) | 设置控件的方向,可设置为水平或竖直方向 |
orientation() | 获取方向 |
setInvertedAppearance(bool) | 设置几何外观左右或上下颠倒 |
invertedAppearance() | 获取几何外观是否颠倒 |
setInvertedControls(bool) | 设置键盘上PageUP和PageDown键是否进行逆向控制 |
invertedControls() | 获取是否进行逆向控制 |
setMaximum(int) | 设置最大值 |
maximum() | 获取最大值 |
setMinimum(int) | 设置最小值 |
minimum() | 获取最小值 |
setPageStep(int) | 设置每次单击滑动区域,控件值的变化量 |
pageStep() | 获取单击滑块区域,控件值的变化量 |
[slot]setRange(int,int) | 设置最小值和最大值 |
setSingleStep(int) | 设置单击两端的箭头或拖动滑块时,控件值的变化量 |
singleStep() | 获取单击两端的箭头或拖动滑块时,控件值的变化量 |
setSliderDown(bool) | 设置滑块是否被按下,该值的设置会影响isSliderDown 的返回值 |
isSliderDown() | 用鼠标移动滑块时,返回True;单击两端的箭头或滑动 区域时,返回False |
setSliderPosition(int) | 设置滑块的位置 |
sliderPosition() | 获取滚动条的位置 |
setTracking(bool) | 设置是否追踪滑块的连续变化 |
[slot]setValue(int) | 设置滑块的值 |
value() | 获取滑块的值 |
setTicklnterval(int) | 设置滑块两个刻度之间的值,仅用于 QSlider 控件 |
滚动条控件QScrollBar的信号
-
最常用的信号是valueChanged(value:int) 此信号是在滑块值发生更改时发出的,并以新的滑块值作为参数。属性值的通知信号。
-
actionTriggered(action:int)信号在用户用鼠标或键盘键改变滑块位置时发送,根据改变方式的不同,信号的参数值也不同action 的值可以取以下值,对应的值分别是0~7,例如
该信号是在滑块动作被触发时发出的。操作为SliderSingleStepAdd、SliderSingletStepSub、SliderPageStepAdd、SliderPageStepSub,SliderToMinimum、SliderToMaximum和SliderMove。
当信号发出时,滑块位置已根据动作进行了调整,但值尚未传播意味着值Changed信号尚未发出,并且视觉显示尚未更新。因此,在连接到此信号的插槽中,您可以根据动作和滑块的值,通过自己调用setSliderPosition来安全地调整任何动作。- 单击两端的箭头改变滑块位置,参数的值是1或2
- 如果单击滑块的轨道改变滑块位置,参数的值是3或4
- 如果拖动滑块参数的值是7
值 QAbstractSlider.SliderNoAction QAbstractSlider.SliderSingleStepAdd QAbstractSlider.SliderSingleStepSub QAbstractSlider.SliderPageStepAdd QAbstractSlider.SliderPageStepSub AbstractSlider.SliderToMinimum QAbstractSlider.SliderToMaximum QAbstractSlider.SliderMove
QScrollBar和QSlider的信号及参数类型 | 说 明 |
---|---|
valueChanged(value:int) | 此信号是在滑块值发生更改时发出的,并以新的滑块值作为参数。 属性值的通知信号。 |
rangeChanged(min:int, max: int) | 当滑块范围发生变化时,会发出此信号,其中min为新的最小值,max为新的最大值。 |
sliderMoved(value:int) | 当sliderDown为true并且滑块移动时,会发出此信号。这种情况通常发生在用户拖动滑块时。该值是新的滑块位置。 即使在关闭跟踪时也会发出此信号。 |
sliderPressed() | 当用户用鼠标按下滑块时,或在调用setSliderDowntrue时以编程方式发出此信号。 |
sliderReleased() | 当用户用鼠标释放滑块时,或在调用setSliderDownfalse时以编程方式发出此信号。 |
actionTriggered(action:int) | 该信号是在滑块动作被触发时发出的。操作为SliderSingleStepAdd、SliderSingletStepSub、SliderPageStepAdd、SliderPageStepSub,SliderToMinimum、SliderToMaximum和SliderMove。 当信号发出时,滑块位置已根据动作进行了调整,但值尚未传播意味着值Changed信号尚未发出,并且视觉显示尚未更新。因此,在连接到此信号的插槽中,您可以根据动作和滑块的值,通过自己调用setSliderPosition来安全地调整任何动作。 QAbstractSlider.SliderNoAction QAbstractSlider.SliderSingleStepAdd QAbstractSlider.SliderSingleStepSub QAbstractSlider.SliderPageStepAdd QAbstractSlider.SliderPageStepSub AbstractSlider.SliderToMinimum QAbstractSlider.SliderToMaximum QAbstractSlider.SliderMove 根据改变方式的不同,信号的参数值也不同action 的值可以取以下值,对应的值分别是0~7 –单击两端的箭头改变滑块位置,参数的值是1或2 –如果单击滑块的轨道改变滑块位置,参数的值是3或4 –如果拖动滑块参数的值是7 |
QScrollBar 例子
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/15 0:56
# File_name: 02-QScrollBar 例子.py
import sys
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
class Example(QWidget):
def __init__(self):
super(Example,self).__init__()
self.initUI()
def initUI(self):
hbox = QHBoxLayout()
self.label = QLabel("拖动滑动条去改变颜色")
self.label.setFont(QFont("Arial",16))
hbox.addWidget(self.label)
self.scrollbar1 = QScrollBar()
self.scrollbar1.setMaximum(255)
self.scrollbar1.sliderMoved.connect(self.sliderval)
hbox.addWidget(self.scrollbar1)
self.scrollbar2 = QScrollBar()
self.scrollbar2.setMaximum(255)
self.scrollbar2.setSingleStep(5)
self.scrollbar2.setPageStep(50)
self.scrollbar2.setValue(150)
self.scrollbar2.setFocusPolicy(Qt.StrongFocus)
self.scrollbar2.valueChanged.connect(self.sliderval)
hbox.addWidget(self.scrollbar2)
self.scrollbar3 = QScrollBar()
self.scrollbar3.setMaximum(255)
self.scrollbar3.setSingleStep(5)
self.scrollbar3.setPageStep(50)
self.scrollbar3.setValue(100)
self.scrollbar3.setFocusPolicy(Qt.TabFocus)
self.scrollbar3.valueChanged.connect(self.sliderval)
hbox.addWidget(self.scrollbar3)
self.setGeometry(300,300,300,200)
self.setWindowTitle('QScrollBar 例子')
self.setLayout(hbox)
def sliderval(self):
value_tup =(self.scrollbar1.value(),self.scrollbar2.value(),self.scrollbar3.value())
_str ="拖动滑动条去改变颜色:\n左边不支持键盘,\n中间通过tab键or点击获取焦点,\n右边只能通过tab键获取焦点。\n当前选中(%d,%d,%d)"% value_tup
palette = QPalette()
palette.setColor(QPalette.WindowText,QColor(*value_tup,255))
self.label.setPalette(palette)
self.label.setText(_str)
if __name__ =='__main__':
app = QApplication(sys.argv)
demo = Example()
demo.show()
sys.exit(app.exec())