如何使用自定义形状创建 QML 滑块?

Posted

技术标签:

【中文标题】如何使用自定义形状创建 QML 滑块?【英文标题】:How to create QML slider with a custom shape? 【发布时间】:2017-05-05 04:58:20 【问题描述】:

我必须创建一个自定义形状的滑块,如下所示(蓝色是滑块手柄):

红色的是凹槽,蓝色的是把手。

【问题讨论】:

random shape 是什么意思? @eyllanesc 是的,措辞不准确。我确实相信 snehitha 的意思是一个滑块,其表单在 QML 中不是默认的。 【参考方案1】:

对于凹槽,您可以使用任何Item 来绘制此形状,例如Image 对于手柄,您只需使用Rectangle 并根据Slider.position 放置它,例如像这样:

Slider 
    id: slider
    width: 400
    height: 150
    y: 200
    handle: Rectangle 
        x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width)
        y: Math.max(slider.topPadding, slider.availableHeight - height + slider.topPadding - ((slider.availableHeight - height) * (slider.position * 2)))
        width: 15
        height: 30
        radius: 5
        color: 'blue'
    

如果你有一个陌生的形状,只需更改 y 的函数即可。 您可以使用将值 position(范围 [0, 1])映射到 y 值的任何函数。您可以使用滑块的每个属性来计算合适的位置。

这是另一个例子,滑块绘制正弦函数:

Slider 
    width: 400
    height: 150
    id: slider1
    y: 200
    handle: Rectangle 
        x: slider1.leftPadding + slider1.visualPosition * (slider1.availableWidth - width)
        y: slider1.topPadding + (slider1.availableHeight - height) / 2  + (slider1.availableHeight - height) / 2 * Math.sin(slider1.position * 10)
        width: 15
        height: 30
        radius: 5
        color: 'blue'
    

这里是为了好玩:一个随机函数。但我不认为你可以给它画一个合适的凹槽

Slider 
    id: slider
    width: 400
    height: 150
    y: 200
    onPositionChanged: 
        var a = Math.round(Math.random() * 5) - Math.round(Math.random() * 5)
        console.log(a)
        handle.handleY = handle.y + (a)
        console.log(handle.handleY)
    
    handle: Rectangle 
        property int handleY: slider.topPadding + slider.availableHeight / 2 - height / 2
        x: slider.leftPadding + slider.visualPosition * (slider.availableWidth - width)
        y: Math.max(slider.topPadding, Math.min(handleY, slider.availableHeight - height + slider.topPadding))
        width: 15
        height: 30
        radius: 5
        color: 'blue'
    

【讨论】:

【参考方案2】:

您可以直接在 QML 中使用 Canvas 或在 Qt C++ (example with a circular slider) 中执行此操作,然后将元素公开给 QML。虽然不是直接复制粘贴解决方案,但请检查 this 以查看使用 arc() 绘制元素的自定义圆形进度条。如果你想要直线,你可以使用line()。滑块的行为也是你必须自己做的事情。

您可以尝试从 Slider 继承,以尝试获取元素所需的部分(甚至大部分)功能。

【讨论】:

以上是关于如何使用自定义形状创建 QML 滑块?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有缩略图滑块的光滑滑块创建自定义滑块?

如果自定义类型从 C++ 作为 const 传递,如何使用 QML 注册自定义类型

Qt 创建一个对触摸事件敏感的 QML 滑块

如何在 ios 中使用自定义形状创建 uiscrollview?

如何创建不规则形状的qml组件

带滑块的 qml textedit