QML 滑块刻度线在开始和结束时带有文本

Posted

技术标签:

【中文标题】QML 滑块刻度线在开始和结束时带有文本【英文标题】:QML slider tickmark with text at start and end 【发布时间】:2016-04-04 08:43:11 【问题描述】:

如何实现这样的目标。 文本是否应该在滑块之外作为标签或它们可以是刻度线的一部分?

【问题讨论】:

【参考方案1】:

这可以通过样式轻松完成。我建议您查看$QTHOME/qml/QtQuick/Controls[/Styles/Base] 中的 QML 控件/样式源代码,以了解 QML 控件的默认样式。

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Styles 1.4


Window 
    id: rootWindow
    visible: true
    height: 800
    width: 800

    Rectangle 
        width: 350
        height: 100
        color: "#555"
        anchors.centerIn: parent
        Slider 
            anchors.centerIn: parent
            minimumValue: 1
            maximumValue: 5
            stepSize: 1
            tickmarksEnabled: true
            width: 300
            style: SliderStyle 
                handle: Rectangle 
                    width: 18
                    height: 30
                    border.width: 2
                    border.color: "#555"
                    color: "#CCC"
                    radius: 5
                
                groove: Rectangle 
                    height: 15
                    width: parent.width
                    anchors.verticalCenter: parent.verticalCenter
                    color: "#CCC"
                
                tickmarks: Repeater 
                    id: repeater
                    model: control.stepSize > 0 ? 1 + (control.maximumValue - control.minimumValue) / control.stepSize : 0

                    Item 
                        Text 
                            y: repeater.height + 5
                            width : repeater.width / repeater.count
                            x: width * index
                            height: 30
                            color: "#CCC"
                            font.pixelSize: 20
                            text: getText()
                            horizontalAlignment: getAlign()

                            function getText() 
                                if(index === 0) return "THIN"
                                else if(index === repeater.count - 1) return "THICK"
                                else return "";
                            
                            function getAlign() 
                                if(index === "0") return Text.AlignLeft
                                else if(index === repeater.count - 1) return Text.AlignRight
                                else return Text.AlignHCenter;
                            
                        
                        Rectangle 
                            color: "#CCC"
                            width: 2 ; height: 5
                            y: repeater.height
                            x: styleData.handleWidth / 2 + index * ((repeater.width - styleData.handleWidth) / (repeater.count-1))
                        
                    
                
            
        
    

该示例充满了过多且毫无价值的代码,但有助于理解。

【讨论】:

我没有测试过这段代码,它看起来肯定不是毫无价值的,正是我想要的。 tickmarksEnabled:true 在这里起着重要的作用,这在 qt 文档中的任何地方都没有提到。新方法谢谢。【参考方案2】:

它们似乎不能成为刻度线的一部分,但您可以使用单独的文本标签轻松实现这一点:

 Slider 
    id: slide
    width: 200
  

  Text 
    text: "THIN"
    anchors.top: slide.bottom
    anchors.left: slide.left
  
  Text 
    text: "THICK"
    anchors.top: slide.bottom
    anchors.right: slide.right
  

【讨论】:

以上是关于QML 滑块刻度线在开始和结束时带有文本的主要内容,如果未能解决你的问题,请参考以下文章

带有刻度文本标签的 Qt 滑块小部件

d3.js - 开始和结束刻度

tvOS - 覆盖开始时间/结束时间滑块 AVPlayerViewController

带有自定义刻度的滑块(标签和速度)

带有刻度尺的响应式 jQuery 滑块,起点和终点将动态变化

如何在开始和结束时创建带有圆形的线条小部件?