前言这一节我们要讲的是滑块Slider,Slider和上一节中的ProgressBar的用法很类似,只不过Slider可以由我们滑动控制来改变value的大小。在实际的应用中,运用Slider的地方也有很多,比如最典型的音量键的调节。Slider的属性和方法对了,这里还有一点需要和大家说明的,我们在教程开始就和大家说后期会使用Controls2的版本,如果大家用的是Controls1,那么控件部分的属性可能是不一样的。这个大家注意一下。Slider从大概念上还是分为了两类的,一类就是我们即将要说的Slider,单向滑块;还有一类是RangeSlider,双向滑块。先来说单向滑块Slider的属性,它有一部分是和ProgressBar重合的 属性
方法
Slider的例程通过两个例程来学习Slider控件,不要忘记导入Controls2控件库哦。新建工程,先来看看水平和竖直方向上的Slider控件。Column{ anchors.centerIn: parent spacing: 20 //水平滑块 Text { id: rowsliderStat text: qsTr("水平方向当前进度10%") font.pixelSize: 20 color: "green" } Slider{ stepSize: 0.01; from: 0 to: 100 value: 1; orientation:Qt.Horizontal snapMode:"SnapAlways" onValueChanged: { rowsliderStat.text = "水平方向当前进度" + value.toFixed(0)+"%"; } } //竖直滑块 Text { id: columnsliderStat text: qsTr("竖直方向当前进度10%") font.pixelSize: 20 color: "green" } Slider{ from: 0 to: 100 stepSize: 0.01; value: 1; orientation:Qt.Vertical snapMode:"SnapAlways" onValueChanged: { columnsliderStat.text = "竖直方向当前进度" + value.toFixed(0)+ "%"; } } } 在界面上定义两个Text分别来记录当前水平和垂直滑块的value值,这里是用了百分比的显示方式。然后定义两个Slider控件,其余的设置都一样,只是方向上一个水平,一个垂直。snapMode选择SnapAlways,这个大家可以自己换别的方式试一下。运行的结果如下。 我们的第二个例子,就是自定义的滑块了,与上一节不同,滑块的可视项是背景项和手柄项。 Slider { id: control value: 0.5 anchors.centerIn: parent width: 200 height: 20 background: Rectangle { id: rect1 width: control.availableWidth height: 10 radius: 7 color: "orange" Rectangle { id: rect2 width: control.visualPosition * rect1.width height: rect1.height color: "red" radius: 7 } } handle: Rectangle { x: control.visualPosition * (control.availableWidth - implicitWidth) y: control.availableHeight / 2 - implicitHeight / 2 implicitWidth: 20 implicitHeight: 26 radius: 13 color: control.pressed ? "green" : "white" border.color: "black" } } 这是一个官方例程,理解起来可能有点麻烦,尤其是关于位置这一块。我们一点一点的来看。先设置背景项,由两个矩形组成,可能有的小伙伴对x、y为什么这样设置很困惑,先带大家看一张图。 从上图可以看出,对于一个Slider控件来说,它包含背景项Background和手柄项(也就是内容项contentitem)。背景项就是底下的可滑动范围,手柄项自然就是滑动按钮了。 再看一下上面的代码,背景项是两个矩形,设置好rect1的大小,高度无要求,宽度就是Slider的availableWidth,可用高度和高度的区别就是相差了padding的距离。而rect2的宽度则是受Slider活动范围的影响而变化,所以这里是rect1的宽度乘上Slider的手柄位置。 最后看我们的手柄项,要设置它的其实位置,x的坐标肯定也是和手柄位置有关系了,但是注意啊,这里还要减去手柄项自身的宽度,要不然当滑到最右端时,手柄项就会溢出。对于y坐标来说,大家看上面的图片,应该可以看出来是availableHeight的一半减去手柄项自身高度的一半。OK,看一下运行的效果。 RangeSlider除了单向的滑块,QML还为大家增加了一个双向滑块控件,它就是RangeSlider,它有两个手柄,两个value值,属性也是在单向的基础上增加了很多。我们来看一下,因为它有两个句柄,所以属性也有两组。我们以第一组来举例。
第二组的属性也包括这些,除此之外,两组的公共属性包括:
RangeSlider的例程关于RangeSlider,我们就看一下它的效果就行了,它的使用方法和单向滑块是一样的,自定义的部分大家可以自己进行练习RangeSlider{ anchors.centerIn: parent from:1 to: 100 first.value: 20 second.value: 80 snapMode: "SnapAlways" stepSize: 1 } 效果如下: 总结源码:14.zip |