qml:无法访问滑块组件中的 styleData

Posted

技术标签:

【中文标题】qml:无法访问滑块组件中的 styleData【英文标题】:qml: Can not access styleData in slider componet 【发布时间】:2017-04-22 13:55:53 【问题描述】:

我需要滑块的句柄宽度值,但即使我只是从 Qt 文档中复制示例代码,调试器仍然会告诉我:

无法读取 null 的属性“handleWidth”

我做错了什么?

我的代码如下

import QtQuick 2.0
import QtQuick.Controls.Styles 1.4
import QtQuick.Controls 1.4

Slider 
    anchors.centerIn: parent

    style: SliderStyle 
        groove: Rectangle 
            implicitWidth: 200
            implicitHeight: 8
            color: "gray"
            radius: 8
        
        handle: Rectangle 
            anchors.centerIn: parent
            color: control.pressed ? "white" : "lightgray"
            border.color: "gray"
            border.width: 2
            implicitWidth: 34
            implicitHeight: 34
            radius: 12

            Text
                text:"test"
                anchors.right:parent.right
                anchors.rightMargin:  styleData.handleWidth * 0.3
            
        
    

更新: 最后我找到了解决方法。 使用 state 和 propertychange 将允许我们从滑块级别更改“handle”属性下的项目属性

【问题讨论】:

如果我使用 Component.onCompleted 打印出“styleData.handleWidth”,我得到:styleData is not defined 【参考方案1】:

它不是公共财产,因为它是not documented。

Here's the relevant source:

Loader 
    id: grooveLoader
    property QtObject styleData: QtObject 
        readonly property int handlePosition: handleLoader.x + handleLoader.width/2
    
    x: padding.left
    sourceComponent: groove
    width: (horizontal ? parent.width : parent.height) - padding.left - padding.right
    y:  Math.round(padding.top + (Math.round(horizontal ? parent.height : parent.width - padding.top - padding.bottom) - grooveLoader.item.height)/2)

Loader 
    id: tickMarkLoader
    anchors.fill: parent
    sourceComponent: control.tickmarksEnabled ? tickmarks : null
    property QtObject styleData: QtObject  readonly property int handleWidth: control.__panel.handleWidth 

Loader 
    id: handleLoader
    sourceComponent: handle
    anchors.verticalCenter: grooveLoader.verticalCenter
    x: Math.round((control.__handlePos - control.minimumValue) / (control.maximumValue - control.minimumValue) * ((horizontal ? root.width : root.height) - item.width))

请注意,没有为 handleLoader 声明的 styleData 对象。

handle 委托决定了滑块手柄的大小,因此您可以随意给它一个值。举个例子,看句柄的Base style's implementation:

property Component handle: Item
    implicitWidth:  implicitHeight
    implicitHeight: TextSingleton.implicitHeight * 1.2

    FastGlow 
        source: handle
        anchors.fill: parent
        anchors.bottomMargin: -1
        anchors.topMargin: 1
        smooth: true
        color: "#11000000"
        spread: 0.8
        transparentBorder: true
        blur: 0.1

    
    Rectangle 
        id: handle
        anchors.fill: parent

        radius: width/2
        gradient: Gradient 
            GradientStop  color: control.pressed ? "#e0e0e0" : "#fff" ; position: 1 
            GradientStop  color: "#eee" ; position: 0 
        
        Rectangle 
            anchors.fill: parent
            anchors.margins: 1
            radius: width/2
            border.color: "#99ffffff"
            color: control.activeFocus ? "#224f7fbf" : "transparent"
        
        border.color: control.activeFocus ? "#47b" : "#777"
    

【讨论】:

感谢您的回复,我需要这些信息是因为手柄按钮的内容是动态的,我需要调整其他gui部分以适应变化。

以上是关于qml:无法访问滑块组件中的 styleData的主要内容,如果未能解决你的问题,请参考以下文章

如何显示当前选择的 QML TreeView?

了解 QML 滑块

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

连接滑块以控制 qml 相机的缩放

无法访问位于同一目录中的 QML 单例

无法访问组件观察器 nuxtjs 中的“this”