qml实现X秒内计数按钮按下N次

描述

使用安卓手机过程中接触过一个功能,比如手机通过数据线接入PC后,连续点击设置中的某个位置达到一定次数后,可以打开开发者选项。
由此可知,这是一种不对普通用户开发的功能,因此不会直接在设置中体现出来,从而通过这种方式“隐藏”这一功能。

效果

在这里插入图片描述
这里使用的是鼠标点击,因此看起来效果并不是很明显,可以通过下面的调试信息观察。

实现环境

Ubuntu16.04 + Qt 5.7.1(qml)

逻辑

重点主要有两个,一是计时器,二是点击次数的统计。

  • 计时器使用qml中的Timer即可;
  • 点击次数的统计则用某个变量进行累加;

代码实现

整个实现逻辑都在TimesAndTimerMouseArea.qml中,如下:

import QtQuick 2.0

Item {
    /* 在countDownSecond秒内按钮按下targetTimes次,则timeToDo */
    property int second: 5 //倒计时时间,单位为s
    property int targetTimes: 5     //达到N次
    function timeToDo() {}          //所要处理的动作,需重载

    width: 50
    height: 50

    QtObject {//用于存放中间变量
        id: countObjdect
        property int clickedTimes: 0
        property int countDownSecond: second
    }

    Rectangle {
        id: clickedArea
        anchors.fill: parent
        color: "#ff3e3e3e"
        radius: 10

        Text {
            anchors.centerIn: parent
            text: "我是\n按钮"
            color: "#ffffffff"
            font.pixelSize: 15
        }

        MouseArea {
            anchors.fill: parent
            onClicked: {
                if (!countClickedTimer.running) {//若当前计时器停止,则重置倒计时
                    countObjdect.countDownSecond = second
                    countClickedTimer.start()
                }
                countObjdect.clickedTimes++
                //当前按下次数达到目标次数并且计时器处于计时状态,则timeToDo
                if (countObjdect.clickedTimes == targetTimes && countClickedTimer.running) {
                    console.log("Clicked times:" + countObjdect.clickedTimes)
                    timeToDo()
                    countClickedTimer.stop()      //停止计时器
                    countObjdect.clickedTimes = 0 //清空按下次数
                }
            }
        }
    }

    Timer {
        id: countClickedTimer
        running: false
        interval: 1000 //计时器间隔,单位为ms
        repeat: true   //重复执行

        onTriggered: {//计时器每触发一次
            countObjdect.countDownSecond--
            //倒计时时间到
            if (countObjdect.countDownSecond <= 0) {
                countClickedTimer.stop()      //停下计时器
                countObjdect.clickedTimes = 0 //清空按下次数
            }
        }
    }
}

整体来说整个功能并不复杂,这里没有进行详细的控件功能的完善,只是做一个简单的demo测试。代码简单,也可从此处下载完整项目代码。

Tips:没有经过过多的测试,如有bug请谅解,欢迎反馈~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值