QML 自定义 Button

文章介绍了如何在QML中利用QtQuick.Controls模块的基础组件,如Rectangle、Text、Image和MouseArea,封装一个自定义的Button组件。该组件支持设置文本或图片,具有鼠标悬浮高亮效果,点击时有动画反馈,并可挂载onClicked事件。通过调整尺寸和内容,实现了组件的灵活性和统一性。
摘要由CSDN通过智能技术生成

QML 中 QtQuick.Controls 模块提供的Button组件能购满足我们绝大多数的使用场景,但是很多情况下,尤其是在复杂页面的制作过程中,我们的按钮要保证和界面具有高度的统一性,就需要自己定义按钮的外观及响应动画,这个时候我们就需要自己封装一个按钮组件。

最终效果如下:

在这里插入图片描述

一、准备工作

  • OS:Windows 10 X64
  • Qt:Qt 6.5.X
  • IDE:Qt Creator 10.0.1
  • 前置知识:Rectangle、Text、Image、MouseArea等组件的使用;QML信号响应

二、要实现的功能

  • 按钮可以设置文本/图片
  • 鼠标悬浮高亮
  • 点击有动画反馈
  • 组件可以挂载 onClicked 事件

三、实现构思

在这里插入图片描述

如上图所示,我们可以绘制一个矩形(Rectangle),然后在矩形内填充一个Image组件和Text组件,用来盛放按钮的图片或文本,最后在Rectangle范围内填充一个MouseArea,来响应鼠标悬浮高亮、点击事件

四、代码实现

新建一个 CustomButton.qml文件:

  1. 先绘制按钮
Rectangle {
    id: customBtn
    width: 50
    height:50

    Text {
        id: customBtnText
        anchors.centerIn: parent
        text: ""
        elide: Text.ElideRight
    }

    Image {
        id: customBtnIcon
        anchors.centerIn: parent
        width:parent.width
        height: parent.height
        source: ""
    }
}
  1. 再设置鼠标响应事件
Rectangle {
    signal clicked
    id: customBtn
    // ...
    MouseArea {
        anchors.fill: parent
        preventStealing:true
        hoverEnabled: true
        onEntered: parent.color = "lightgray"
        onExited: parent.color = "transparent"
        enabled: true
        onReleased: {
            customBtn.clicked()
        }
    }
    // ...
}
  1. 添加动画反馈
Rectangle {
    id: customBtn
    // ...
    property real pressScale: 0.95

    Behavior on scale {
        NumberAnimation {
            duration: 100
            easing.type: Easing.InOutQuad
        }
    }

    MouseArea {
        anchors.fill: parent
        preventStealing:true
        hoverEnabled: true
        onEntered: parent.color = "lightgray"
        onExited: parent.color = "transparent"
        enabled: true
        onPressed: customBtn.scale = customBtn.pressScale
        onReleased: {
            customBtn.scale = 1;
            // ...
        }
    }
    // ...
}
  1. 封装组件,添加必要的属性
Rectangle {
    id: customBtn
    width: 1
    height:1
    property alias source: customBtnIcon.source
    property alias text: customBtnText.text
    // ...

    // 如果没有传入 width、height属性,根据text内容自动调整大小
    Component.onCompleted: {
        customBtn.width = customBtn.width === 1 ? customBtnText.width + 10 : customBtn.width
        customBtn.height = customBtn.height === 1 ? customBtnText.width + 10 : customBtn.height
    }

}

至此,一个相对完整的 Button 组件就封装完成了,我们可以从外部调用,在同级目录下新建一个 main.qml文件,添加以下内容:

import QtQuick

Rectangle {

    width: 100
    height: 100

    CustomButton {
        anchors.centerIn: parent
//        text: "收集"
        source: "shot.png"
        width: 50
        height: 50
        onClicked:{
            console.log('hhhhhhh')
        }
    }
}

完整工程文件下载

CustomButton.zip


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YumOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值