QML学习笔记(八)— QML实现列表侧滑覆盖按钮

QML实现列表右边滑动删除按钮,并覆盖原有的操作按钮,点击可实现删除当前项

本文链接:QML实现列表侧滑覆盖按钮

作者:狐狸家的鱼

GitHub:八至

列表实现在另一篇博客已经提及,列表可选中、拖拽、编辑,现在优化一下,实现滑动删除效果,并覆盖原有的操作按钮。

主要就是对操作按钮与删除按钮之间做一个动态切换效果。

管制按钮一开始就是默认显示的,代码如下:

                   //管制按钮
                                Rectangle{
                                    id: controlBtn
                                    anchors.verticalCenter: parent.verticalCenter
                                    height: controlRect.height - 1
                                    width: controlRect.width - 1
                                    radius: 3
                                    color:"#42A5F5"
                                    Text {
                                        id:btnTex
                                        font.family: "microsoft yahei"
                                        font.pointSize: 10
                                        anchors.centerIn: parent
                                        text: ctrBtn
                                        color: Global.GlobalVar.whiteColor
                                    }
                                    MouseArea{
                                        anchors.fill: parent
                                    }
                                }

删除按钮一开始是不显示的,宽度设置为0,这样在动态切换的时候对宽度进行设置即可

                    //删除按钮
                                Rectangle{
                                    id:delBtn
                                    anchors.verticalCenter: parent.verticalCenter
                                    height: controlRect.height-1
                                    width: 0
                                    radius: 3
                                    color: Global.GlobalVar.remindColor
                                   
                                    Text {
                                        id:delTex
                                        font.family: "microsoft yahei"
                                        font.pointSize: 10
                                        anchors.centerIn: parent
                                        color: Global.GlobalVar.whiteColor
                                    }
                                    MouseArea{
                                        anchors.fill: parent
                                        onClicked: {
                                            sstpModel.remove(sstpView.currentIndex)
                                        }
                                    }
                                }

因为要滑动覆盖按钮,所有这里存在四个动画,第一是删除按钮需要滑动设置宽度大于0,显示出来,第二是管制按钮的宽度设置为0,被删除按钮覆盖隐藏掉,第三是点击当前项的其他地方,将已经显示的删除按钮隐藏,宽度设为0,第四是管制按钮再次显示,宽度设为大于0:

                   //滑动显示删除按钮,覆盖管制按钮
                                PropertyAnimation{
                                    id: delBtnShow
                                    target: delBtn
                                    property: "width"
                                    duration: 150
                                    from: 0
                                    to: controlRect.width - 1
                                }
                                PropertyAnimation{
                                    id: delBtnHide
                                    target: delBtn
                                    property: "width"
                                    duration: 150
                                    from: controlRect.width - 1
                                    to: 0
                                }
                                //点击隐藏删除按钮,显示管制按钮
                                PropertyAnimation{
                                    id: ctrBtnShow
                                    target: controlBtn
                                    property: "width"
                                    duration: 150
                                    from: 0
                                    to: controlRect.width - 1
                                }
                                PropertyAnimation{
                                    id: ctrBtnHide
                                    target: controlBtn
                                    property: "width"
                                    duration: 150
                                    from: controlRect.width - 1
                                    to: 0
                                }

动态效果如何触发呢,滑动是鼠标按压->拖动->鼠标释放实现的,逻辑处理如下:

在代理的当前项鼠标可操作区域MouseArea{}声明点击的坐标点

 property point clickPos: "0,0"

然后在鼠标按压事件里获取当前坐标点:

onPressed: {
    ...
     clickPos  = Qt.point(mouse.x,mouse.y)

}

鼠标释放完成滑动覆盖:

               onReleased: {
                            
                            var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
                            console.debug("delta.x: " + delta.x);
                            if (
                                    (delta.x < 0) &&
                                    (delBtnShow.running === false && ctrBtnHide.running === false) &&
                                    (delBtn.width == 0)
                                    ){
                                delBtnShow.start();
                                delTex.text = "删除"
                                ctrBtnHide.start();

                            }else if (
                                      (delBtnHide.running === false && ctrBtnShow.running === false) &&
                                      (delBtn.width > 0)
                                      ){
                                delBtnHide.start();
                                delTex.text = ""
                                ctrBtnShow.start();
                            }
                        }

这样就实现效果啦。

完整代码如下,作为参考:

import QtQuick 2.7
import QtQuick.Window 2.3
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.2
import Qt.an.qobjectSingleton 1.0 as Global
import "../../Component"
Window{
    id:sstpWind
    width: 580
    height: 420
    minimumWidth: 520
    minimumHeight: 420
    title: "Sttp SetUp Window"
    color: Global.GlobalVar.windowBg
    visible: true
    ListView{
        id:sstpView
        property bool isClicked: false //初始化没有点击事件
        anchors.fill: parent
        clip:true
        interactive: !isClicked
        focus: true
        flickableDirection: Flickable.VerticalFlick
        boundsBehavior: Flickable.StopAtBounds
        ScrollBar.vertical: ScrollBar {id:scrollBar;active: true;}
        Keys.onUpPressed: scrollBar.decrease()
        Keys.onDownPressed: scrollBar.increase()
        move:Transition {
            NumberAnimation{
                properties: "x,y";
                duration: 300
            }
        }
        anchors {
            left: parent.left; top: parent.top; right: parent.right;
            margins: 2
        }
        spacing: 4
        cacheBuffer: 50

        //model: anAirModel
        model: ListModel{
            id:sstpModel;
            ListElement{
                num_1:1
                num_2:'-020'
                ssr:'A5010'//应答机编码
                air_iden:"CES5401"//呼号 航班号
                vip:true//是否为vip
                type:"B737-800"//机型
                status:"放行"//状态
                el:"16"//机场标高 ALT-高度
                ctrBtn:"滑行"// 管制按钮  HANDOVER-移交 CLR-放行 TAI-滑行  OFF-起飞 DESCENT-降落 DISENGAGE-脱离
                time:"1215"//时间
                airport:"ZPPP"//机场
                runway:"01"// 跑道
                procedure:"LUM-01D"//进离场程序
            }
            ListElement{
                num_1:1
                num_2:'-020'
                ssr:'A5610'//应答机编码
                air_iden:"CES5401"//呼号 航班号
                vip:true//是否为vip
                type:"B737-800"//机型
                status:"五边"//状态
                el:"16"//机场标高 ALT-高度
                ctrBtn:"脱离"// 管制按钮  HANDOVER-移交 CLR-放行 TAI-滑行  OFF-起飞 DESCENT-降落 DISENGAGE-脱离
                time:"1215"//时间
                airport:"ZPMS"//机场
                runway:"01"// 跑道
                procedure:"LUM-09A"//进离场程序
            }
            ListElement{
                num_1:1
                num_2:'-020'
                ssr:'A0026'//应答机编码
                air_iden:"CES5401"//呼号 航班号
                vip:false//是否为vip
                type:"B737-"//机型
                status:"穿越"//状态
                el:"16"//机场标高 ALT-高度
                ctrBtn:"移交"// 管制按钮  HANDOVER-移交 CLR-放行 TAI-滑行  OFF-起飞 DESCENT-降落 DISENGAGE-脱离
                time:"1215"//时间
                airport:"ZPLJ"//机场
                runway:"01"// 跑道
                procedure:"LUM-06A"//进离场程序
            }
            ListElement{
                num_1:1
                num_2:'-020'
                ssr:'A0026'//应答机编码
                air_iden:"CES5401"//呼号 航班号
                vip:true//是否为vip
                type:"B737-0"//机型
                status:"穿越"//状态
                el:"16"//机场标高 ALT-高度
                ctrBtn:"移交"// 管制按钮  HANDOVER-移交 CLR-放行 TAI-滑行  OFF-起飞 DESCENT-降落 DISENGAGE-脱离
                time:"1215"//时间
                airport:"ZPLJ"//机场
                runway:"01"// 跑道
                procedure:"LUM-06A"//进离场程序
            }
            ListElement{
                num_1:1
                num_2:'-020'
                ssr:'A0026'//应答机编码
                air_iden:"CES5401"//呼号 航班号
                vip:false//是否为vip
                type:"B737-800"//机型
                status:"穿越"//状态
                el:"16"//机场标高 ALT-高度
                ctrBtn:"移交"// 管制按钮  HANDOVER-移交 CLR-放行 TAI-滑行  OFF-起飞 DESCENT-降落 DISENGAGE-脱离
                time:"1215"//时间
                airport:"ZPLJ"//机场
                runway:"01"// 跑道
                procedure:"LUM-06A"//进离场程序
            }
            ListElement{
                num_1:1
                num_2:'-020'
                ssr:'A0026'//应答机编码
                air_iden:"CES5401"//呼号 航班号
                vip:true//是否为vip
                type:"A357"//机型
                status:"穿越"//状态
                el:"16"//机场标高 ALT-高度
                ctrBtn:"移交"// 管制按钮  HANDOVER-移交 CLR-放行 TAI-滑行  OFF-起飞 DESCENT-降落 DISENGAGE-脱离
                time:"1215"//时间
                airport:"ZPLJ"//机场
                runway:"01"// 跑道
                procedure:"LUM-06A"//进离场程序
            }
            ListElement{
                num_1:1
                num_2:'-020'
                ssr:'A0026'//应答机编码
                air_iden:"CES5401"//呼号 航班号
                vip:true//是否为vip
                type:"A737"//机型
                status:"穿越"//状态
                el:"16"//机场标高 ALT-高度
                ctrBtn:"移交"// 管制按钮  HANDOVER-移交 CLR-放行 TAI-滑行  OFF-起飞 DESCENT-降落 DISENGAGE-脱离
                time:"1215"//时间
                airport:"ZPLJ"//机场
                runway:"01"// 跑道
                procedure:"LUM-06A"//进离场程序
            }
        }

        delegate:Rectangle{
                    id:sstpDelegate
                    property int fromIndex:0
                    property int toIndex:0
                    property var controlColor:["#00C9FD", "#DB0058", "#FF7400", "#81EE8E"]
                    width: parent.width
                    height: 60
                    MouseArea {
                        id:mousearea
                        property point clickPos: "0,0"
                        anchors.fill: parent
                        onClicked: {
                            sstpView.currentIndex = index
                        }
                        onPressed: {
                            sstpView.currentIndex = index
                            sstpDelegate.fromIndex = index
                            sstpView.isClicked = true //每项按钮点击就true

                            clickPos  = Qt.point(mouse.x,mouse.y)

                        }
                        onReleased: {
                            sstpView.isClicked = false //每项按钮点击就false
                            console.log("fromIndex:",sstpDelegate.fromIndex,"toIndex:",sstpDelegate.toIndex)

                            var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
                            console.debug("delta.x: " + delta.x);
                            if (
                                    (delta.x < 0) &&
                                    (delBtnShow.running === false && ctrBtnHide.running === false) &&
                                    (delBtn.width == 0)
                                    ){
                                delBtnShow.start();
                                delTex.text = "删除"
                                ctrBtnHide.start();

                            }else if (
                                      (delBtnHide.running === false && ctrBtnShow.running === false) &&
                                      (delBtn.width > 0)
                                      ){
                                delBtnHide.start();
                                delTex.text = ""
                                ctrBtnShow.start();
                            }
                        }
                        onPositionChanged: {
                            var lastIndex = sstpView.indexAt(mousearea.mouseX + sstpDelegate.x,mousearea.mouseY + sstpDelegate.y);
                            if ((lastIndex < 0) || (lastIndex > sstpModel.rowCount()))
                                return;
                            if (index !== lastIndex){
                                sstpModel.move(index, lastIndex, 1);
                            }
                            sstpDelegate.toIndex = lastIndex;
                        }
                    }
                    Row{
                        Rectangle{//选中当前 颜色高亮
                            id:curRect
                            width: 5
                            height: sstpDelegate.height
                            color: index===sstpView.currentIndex ? Global.GlobalVar.sstpCurIndex : Global.GlobalVar.mainFontColor//选中颜色设置
                        }
                        //进程单信息
                        Rectangle{
                            id:infoRect
                            width: sstpDelegate.width - controlRect.width - 5
                            height: sstpDelegate.height
                            Row{
                                Rectangle{
                                    width: infoRect.width/6
                                    height: infoRect.height
                                    ColumnLayout{
                                        anchors.verticalCenter: parent.verticalCenter
                                        anchors.horizontalCenter: parent.horizontalCenter
                                        MyText{//num_1
                                            text: num_1
                                            fontColor: b1;
                                            fontSize: m;
                                        }
                                        Rectangle{
                                            implicitWidth: 28
                                            implicitHeight:  28
                                            radius: 28;
                                            color: controlColor[3]
                                            MyText{//num_2
                                                anchors.centerIn: parent
                                                text:num_2
                                                fontColor:b1
                                            }
                                        }
                                    }
                                }
                                Rectangle{
                                    width: infoRect.width/6
                                    height: infoRect.height
                                    //第二列
                                    ColumnLayout{
                                        anchors.verticalCenter: parent.verticalCenter
                                        MyText{//航班呼号
                                            text: air_iden
                                            fontColor: b1
                                            fontSize: xl
                                        }
                                        MyText{//状态
                                            text:status;
                                            fontColor: b1
                                            fontSize: l
                                        }
                                    }
                                }
                                Rectangle{
                                    width: infoRect.width/6
                                    height: infoRect.height
                                    //第三列
                                    ColumnLayout{
                                        anchors.verticalCenter: parent.verticalCenter
                                        anchors.left: parent.left
                                        anchors.leftMargin: parent.width/6
                                        //anchors.horizontalCenter: parent.horizontalCenter
                                        Rectangle{
                                            width: 15
                                            height: 15
                                            radius: 15
                                            color: vip ? controlColor[0]: "transparent"
                                            MyText{//vip
                                                anchors.centerIn: parent
                                                text: vip ? "V" :''//判断布尔值
                                                color: "#FFF"
                                                fontColor:color
                                                fontSize: s
                                            }
                                        }
                                        MyText{
                                            text: type;
                                            fontColor: b1
                                            fontSize: m
                                        }
                                    }
                                }
                                Rectangle{
                                    width: infoRect.width/6
                                    height: infoRect.height
                                    //第四列
                                    ColumnLayout{
                                        anchors.verticalCenter: parent.verticalCenter
                                        anchors.horizontalCenter: parent.horizontalCenter
                                        TextInput{//机场
                                            text: airport;
                                            color: Global.GlobalVar.mainFontColor
                                            font.pointSize: 12
                                            onEditingFinished: {

                                            }
                                        }
                                        MyText{//标高
                                            text: el;
                                            fontColor: b1
                                            fontSize: m
                                        }
                                    }
                                }
                                Rectangle{
                                    width: infoRect.width/6
                                    height: infoRect.height
                                    //第五列
                                    ColumnLayout{
                                        anchors.verticalCenter: parent.verticalCenter
                                        anchors.horizontalCenter: parent.horizontalCenter
                                        TextInput{//进离场程序
                                            text: procedure;
                                            color: Global.GlobalVar.mainFontColor
                                            font.pointSize: 12
                                        }
                                        MyText{//应答机编码
                                            text: ssr;
                                            fontColor: b1
                                            fontSize: m
                                        }

                                    }
                                }

                                Rectangle{
                                    width: infoRect.width/6
                                    height: infoRect.height
                                    //第六列
                                    ColumnLayout{
                                        anchors.verticalCenter: parent.verticalCenter
                                        anchors.horizontalCenter: parent.horizontalCenter
                                        TextInput{//时间
                                            text: time;
                                            color: controlColor[2];
                                            font.pointSize: 12
                                            onEditingFinished: {

                                            }
                                        }
                                        TextInput{//降落跑道
                                            text: runway;
                                            color: Global.GlobalVar.mainFontColor
                                            font.pointSize: 12
                                            onEditingFinished: {

                                            }
                                        }
                                    }
                                }
                            }
                        }
                        RecLine{id:recLine;direction:false}
                        Rectangle{
                            id:controlRect
                            width: 80
                            height: sstpDelegate.height
                            Row{
                                //管制按钮
                                Rectangle{
                                    id: controlBtn
                                    anchors.verticalCenter: parent.verticalCenter
                                    height: controlRect.height - 1
                                    width: controlRect.width - 1
                                    radius: 3
                                    //color: Global.GlobalVar.btnBorderColor
                                    color:"#42A5F5"
                                    //color: ctrBtn == "滑行" ? controlColor[0] : (ctrBtn == "脱离" ? controlColor[1] : (ctrBtn == "移交" ? controlColor[2] : Global.GlobalVar.mainColor))
                                    Text {
                                        id:btnTex
                                        font.family: "microsoft yahei"
                                        font.pointSize: 10
                                        anchors.centerIn: parent
                                        text: ctrBtn
                                        color: Global.GlobalVar.whiteColor
                                    }
                                    MouseArea{
                                        anchors.fill: parent
                                    }
                                }
                                //删除按钮
                                Rectangle{
                                    id:delBtn
                                    anchors.verticalCenter: parent.verticalCenter
                                    height: controlRect.height-1
                                    width: 0
                                    radius: 3
                                    color: Global.GlobalVar.remindColor
                                    //color: ctrBtn == "滑行" ? controlColor[0] : (ctrBtn == "脱离" ? controlColor[1] : (ctrBtn == "移交" ? controlColor[2] : Global.GlobalVar.mainColor))
                                    Text {
                                        id:delTex
                                        font.family: "microsoft yahei"
                                        font.pointSize: 10
                                        anchors.centerIn: parent
                                        color: Global.GlobalVar.whiteColor
                                    }
                                    MouseArea{
                                        anchors.fill: parent
                                        onClicked: {
                                            sstpModel.remove(sstpView.currentIndex)
                                        }
                                    }
                                }
                                //滑动显示删除按钮,覆盖管制按钮
                                PropertyAnimation{
                                    id: delBtnShow
                                    target: delBtn
                                    property: "width"
                                    duration: 150
                                    from: 0
                                    to: controlRect.width - 1
                                }
                                PropertyAnimation{
                                    id: delBtnHide
                                    target: delBtn
                                    property: "width"
                                    duration: 150
                                    from: controlRect.width - 1
                                    to: 0
                                }
                                //点击隐藏删除按钮,显示管制按钮
                                PropertyAnimation{
                                    id: ctrBtnShow
                                    target: controlBtn
                                    property: "width"
                                    duration: 150
                                    from: 0
                                    to: controlRect.width - 1
                                }
                                PropertyAnimation{
                                    id: ctrBtnHide
                                    target: controlBtn
                                    property: "width"
                                    duration: 150
                                    from: controlRect.width - 1
                                    to: 0
                                }
                            }
                        }
                    }
                }
        }
        

 

转载于:https://www.cnblogs.com/suRimn/p/10869571.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现可拖拽、编辑、选中的ListView可以提升用户交互体验,下面介绍一种实现方法。 1. 定义ListView 首先,我们需要定义一个ListView,用于显示列表项。在ListView中,我们需要指定model、delegate、highlight、onPressed、onPositionChanged等属性。 ``` ListView { id: listView model: ListModel { id: listModel } delegate: Component { id: delegate Rectangle { id: item width: listView.width height: 50 color: "white" border.width: 1 border.color: "black" Text { id: text anchors.centerIn: parent text: model.text } MouseArea { id: mouseArea anchors.fill: parent drag.target: item drag.axis: Drag.XAxis drag.minimumX: -listView.width drag.maximumX: listView.width drag.active: listView.currentIndex === index onPressed: { listView.currentIndex = index listView.positionViewAtIndex(index, ListView.Center) } } Rectangle { id: indicator width: 10 height: 10 color: "green" radius: width / 2 visible: listView.currentIndex === index anchors { right: parent.right verticalCenter: parent.verticalCenter margins: 10 } } } } highlight: Rectangle { color: "lightgray" width: listView.width height: 50 border.width: 1 border.color: "black" } onPositionChanged: { if (listView.moving) return; var index = listView.indexAt(listView.contentItem.x, listView.contentItem.y) if (index !== -1 && index !== listView.currentIndex) { listView.currentIndex = index } } } ``` 在上面的代码中,ListView中的delegate定义了每个列表项的展示方式。我们在delegate中定义了一个MouseArea,用于实现可拖拽的功能。在MouseArea的drag.target属性中,我们指定了可拖拽的目标为列表项item。设置drag.axis为Drag.XAxis,表示只能在水平方向上拖拽。设置drag.minimumX为-listView.width,drag.maximumX为listView.width,表示只能在ListView的宽度范围内拖拽。在onPressed事件中,我们设置了当前列表项为选中状态,并将其居中展示。 2. 定义编辑界面 为了实现编辑功能,我们需要定义一个编辑界面。在编辑界面中,用户可以修改列表项的文本内容。我们可以使用一个Dialog来实现编辑界面。 ``` Dialog { id: editDialog title: "Edit Item" modal: true width: 400 height: 200 visible: false TextField { id: textField anchors.centerIn: parent width: parent.width - 40 placeholderText: "Enter item text" } Button { text: "OK" onClicked: { var index = listView.currentIndex if (index !== -1) { listModel.setProperty(index, "text", textField.text) } editDialog.close() } enabled: textField.text !== "" anchors { right: parent.right bottom: parent.bottom margins: 10 } } Button { text: "Cancel" onClicked: editDialog.close() anchors { left: parent.left bottom: parent.bottom margins: 10 } } } ``` 在上面的代码中,我们定义了一个Dialog,其中包含一个TextField和两个Button。用户可以在TextField中输入新的文本内容,然后点击OK按钮保存修改,或点击Cancel按钮取消修改。 3. 实现选中效果 为了让用户能够明显地看到当前选中的列表项,我们可以在每个列表项上添加一个指示器。在ListView的delegate中,我们定义了一个Rectangle,用于显示当前选中的列表项。在Rectangle的visible属性中,我们使用listView.currentIndex === index来判断当前列表项是否被选中。 4. 实现编辑功能 在ListView中,我们可以通过双击或长按来触发编辑功能。在ListView的delegate中,我们为item和mouseArea分别定义了onDoubleClicked和onLongPressed事件。在onDoubleClicked事件中,我们弹出编辑界面,让用户可以修改当前选中的列表项的文本内容。在onLongPressed事件中,我们弹出上下文菜单,让用户可以选择删除当前选中的列表项。 ``` MouseArea { id: mouseArea anchors.fill: parent drag.target: item drag.axis: Drag.XAxis drag.minimumX: -listView.width drag.maximumX: listView.width drag.active: listView.currentIndex === index onPressed: { listView.currentIndex = index listView.positionViewAtIndex(index, ListView.Center) } onDoubleClicked: { editDialog.visible = true textField.text = model.text textField.selectAll() } onLongPressed: { var menu = Menu { MenuItem { text: "Delete" onTriggered: listModel.remove(index) } } menu.popup() } } ``` 在上面的代码中,我们为mouseArea分别定义了onDoubleClicked和onLongPressed事件。在onDoubleClicked事件中,我们弹出编辑界面editDialog,并将当前选中的列表项的文本内容显示在TextField中。在onLongPressed事件中,我们弹出上下文菜单Menu,其中包含一个MenuItem,用于删除当前选中的列表项。 5. 实现拖拽功能 在ListView中,我们可以通过拖拽来调整列表项的顺序。在ListView的delegate中,我们为item定义了onDropped事件。在onDropped事件中,我们交换拖拽的两个列表项的位置。 ``` Rectangle { id: item width: listView.width height: 50 color: "white" border.width: 1 border.color: "black" Text { id: text anchors.centerIn: parent text: model.text } MouseArea { id: mouseArea anchors.fill: parent drag.target: item drag.axis: Drag.XAxis drag.minimumX: -listView.width drag.maximumX: listView.width drag.active: listView.currentIndex === index onPressed: { listView.currentIndex = index listView.positionViewAtIndex(index, ListView.Center) } onDropped: { if (drag.source !== drag.target) { var fromIndex = drag.source.index var toIndex = drag.target.index listModel.move(fromIndex, toIndex, 1) } } } Rectangle { id: indicator width: 10 height: 10 color: "green" radius: width / 2 visible: listView.currentIndex === index anchors { right: parent.right verticalCenter: parent.verticalCenter margins: 10 } } } ``` 在上面的代码中,我们为mouseArea定义了onDropped事件。在onDropped事件中,我们使用ListModel的move方法来交换拖拽的两个列表项的位置。 至此,我们已经实现了可拖拽、编辑、选中的ListView。这个ListView可以让用户方便地调整列表项的顺序,同时也可以让用户快速修改列表项的文本内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值