如何在 QML 5.2 中使用 JavaScript 访问一个按钮内的 buttonStyle 对象

Posted

技术标签:

【中文标题】如何在 QML 5.2 中使用 JavaScript 访问一个按钮内的 buttonStyle 对象【英文标题】:How to access the buttonStyle object inside of one button using JavaScript in QML 5.2 【发布时间】:2014-01-08 09:53:37 【问题描述】:

下面是我的 Qml 代码:

Button 
    id: newMenu

    anchors 
        top: topMenu.top
        topMargin: 15
        left: topMenu.left
        leftMargin: 16
    

    text: "New"
    iconSource: "../images/New.png"

    MouseArea 
        id: mouseArea
        anchors.fill: parent
        hoverEnabled: true         //this line will enable mouseArea.containsMouse
        onClicked: 
            newProjectFileDlg.visible = true
        
        onEntered: 
            console.log(tt1);
        
    

    style: ButtonStyle 
        id: buttonStyle
        background: Rectangle 
            id: tt1
            implicitWidth: 100
            implicitHeight: 25
            border.width: 0
            radius: 4
            color: mousearea.entered ? "lightsteelblue" : "#2e2e2e"
        
    

我想访问这个按钮的样式属性,当鼠标悬停时改变背景颜色。但是 console.log 输出总是

qrc:/qmls/menu.qml:40: ReferenceError: tt1 is not defined

如何使用 javascript 获取元素?或者我们是否有其他方法可以在输入鼠标时更改背景颜色。

【问题讨论】:

你为什么使用 tt1 而不是 buttonStyle?这会引发类似的 ReferenceError 吗? @LaszloPapp 是的,它输出 qrc:/qmls/menu.qml:40: ReferenceError: buttonStyle is not defined 嗨。我不确定您是否在寻找什么,但是您可以简单地使用“控件”更改 ButtonStyle 的背景颜色,就像这样: color: control.pressed ? "#f00" : (control.hovered||control.activeFocus ? "#0f0" : "#00f") 【参考方案1】:

回答您的问题,您应该定义公共财产,例如:

Button 
    id: root

    property color backgroundColor: pressed ? 'skyblue' 
                                            : mousearea.entered ? "lightsteelblue" 
                                                                : "#2e2e2e"
    ...

    MouseArea  id: mousearea; ... 

    style: ButtonStyle 
        background: Rectanlge  color: root.backgroundColor; ... 
    

然后使用 is 属性覆盖默认实现。

但是,

您正在尝试以完全错误的方式使用样式。 StyleControl 状态的直观表示,不应在运行时手动更改。因此,正确的方法是将控件属性绑定到样式(例如使用属性control)。

style: ButtonStyle 
    background: Rectangle 
         color: control.hovered ? 'lightsteelblue' 
                                : 'skyblue'
    

【讨论】:

【参考方案2】:

您可以在不使用样式的情况下实现类似的效果,方法是在按钮内嵌套一个矩形,然后使用 onHoveredChanged 属性修改不透明度。下面是一个例子。我这样做是为了避免与普通按钮样式的悬停效果冲突。

Button  
   text: "Push me"
   Rectangle 
      id: myRectId 
      anchors.fill: parent 
      anchors.margins: 1 
      color: "green" 
      opacity : .2 
    
    onHoveredChanged: hovered ? myRectId.opacity = 0 : myRectId.opacity = .2; 
 

这最终看起来像这样:

【讨论】:

以上是关于如何在 QML 5.2 中使用 JavaScript 访问一个按钮内的 buttonStyle 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QML 中编辑 QQmlListProperty

如何在 QML 的 ColumnLayout 中使用 topMargin

如何在 QML 中处理 Stylus/Pen 输入

导入 JavaScript 时如何在 QML 中使用绝对路径?

QML:如何自定义组件并在同一个文件中使用它

如何在QML中使用不同的字体