Qml之按钮控件

实现一个普通的按钮控件

 

 

 

 

思路一:根据功能点出发,就是要点击效果

1、定义一个按钮控件,利用按钮控件自带的点击效果onClicked,实现“点击功能”

2、在这个按钮控件基础上,利用背景设置,再将一个有颜色矩形框作为背景。

3、在矩形框中再配置各种文字。

Button{
        width: 160
        height: 32
        x:150
        y:150
        background: Rectangle{
            color: "#FF228FFF"
            radius: 2
            //border.width: 1
            //border.color:Qt.rgba(0,0,0,0.09)
            Text{
                text: qsTr("下一步")
                anchors.centerIn: parent
                font.pixelSize: 14
                font.family: "Microsoft YaHei"
                color: "#FFFFFFFF"
            }
        }
        onClicked: {
            console.log("123456")
        }
    }

 


思路二:根据直面的视觉,这就是一个矩形框 

1、就是一个矩形框,且是带有样式的矩形框;因此直接定义一个矩形框。

2、在这个已定义好的矩形框中,再配置各种文字。

3、利用鼠标事件。将这个矩形框所在区域配置为鼠标区域,进而触发“onChecked”事件。

Rectangle{
        width: 160
        height: 32
        //border.color: "#17000000"
        //border.width: 1
        x:450
        y:150
        Text{
            text: qsTr("下一步")
            anchors.centerIn: parent
            font.pixelSize: 14
            font.family: "Microsoft YaHei"
            color: "#A6000000"
        }
        MouseArea{
            anchors.fill: parent
            //cursorShape: Qt.OpenHandCursor
            onClicked: {
                console.log("654321")
            }
        }
    }

 


利用思路二实现,有一个优势:可以修改光标的样式。比如小手(cursorShape: Qt.OpenHandCursor)

 

 

MouseArea信号

MouseArea:onCanceles()
当鼠标事件没有被接受或是被其他元素截获时,MouseArea:onCanceles()会被调用。当有多个MouseArea处理输入时
或是Flickable元素中包含一个MouseArea时,MouseArea:onCanceles()会显得特别重要。如果在Flickable元素中包
含一个MouseArea时,当执行一些针对于按下信号的逻辑处理然后又拖动鼠标时,Flickable会从MouseArea中截获鼠标
事件。在这种情况下,当Flickable截获了MouseArea的鼠标事件时需要重置逻辑。

MouseArea:onClicked(MouseEvent mouse)
当有单击事件(在MouseArea中按下紧接着弹起)发生时,MouseArea:onClicked方法会被调用。

MouseArea:onDoubleClicked(MouseEvent mouse)
当有双击事件(按下紧接着弹起然后再按下)发生时调用。在MouseArea:onDoubleClicked中如果将accepted属性设置
为假,则在第二次单击时onPressed、onReleased、onClicked仍会被调用,否则在第二次单击时onPressed、onReleased、
onClicked不会被调用。

MouseArea:onEntered()
当鼠标进入MouseArea中时,MouseArea:onEntered()会被调用。默认情况下,只有当鼠标在MouseArea中单击时才会调用,
可如果将hoverEnabled设置为真,当鼠标拖动至MouseArea时也会调用onEntered();

MouseArea:onExites( )
当鼠标离开MouseArea中时,MouseArea:onExites( )会被调用。默认情况下,只有当鼠标在MouseArea中单击时才会调用,
可如果将hoverEnabled设置为真,当鼠标拖动至MouseArea时也会调用onExited ();

MouseArea:onPositionChanged ( MouseEvent mouse )
当鼠标位置发生改变时会调用onPositionChanged,在这个方法中不会考虑MouseEvent参数的accepted属性,也就是说所有的
鼠标事件在这里都会被处理,并不会因为某个鼠标事件被拒绝了而不做处理。默认情况下,只有在鼠标按下时才会调用onPositionChanged。
不过如果将hoverEnabled设置为真,当鼠标移动时onPositionChanged也会被调用。

MouseArea:onPressed ( MouseEvent mouse )
当有鼠标按下时onPressed会被调用。MouseEvent类型的参数提供有关按下时的鼠标信息,包括鼠标的位置以及按下时对应的鼠标按键。
参数mouse的accepted属性决定了MouseArea是否要处理这个鼠标事件。如果mouse的accept属性被设置为假则直到下一个按下事件发生,
这这间任何鼠标事件都不会发送给MouseArea。

MouseArea:onReleased ( MouseEvent mouse )
当有鼠标弹起时会调用onReleased。MouseEvent类型的参数提供有关按下时的鼠标信息,包括鼠标的位置以及按下时对应的鼠标按键。
参数mouse的accepted属性会被忽略不做处理

 

 


补充: 

矩形框嵌套鼠标事件非常实用,比如实现"点击文字"+“小手”。

1)如果使用Button+Text,能实现点击功能,但是小手有点难实现,代码也会显得冗余。

2)使用Rectangle+MouseArea,就比较简单实现了。注意的是:需要将矩形框的边框设置为0(border.width: 0)

 

Rectangle{
        width: 50
        height: 50
        visible: true
        x:100
        y:10
        border.width: 0
        Text {
            anchors.centerIn: parent
            text: qsTr("测试测试")
        }
        MouseArea{
            hoverEnabled: true
            cursorShape: Qt.OpenHandCursor
            anchors.fill: parent
            onClicked: {
                console.log("99999")}
        }
    }

 

  

 

posted @ 2021-07-18 22:00  gd_沐辰  阅读(1635)  评论(0编辑  收藏  举报