QML自定义可长按短按的SpinBox

news2025/7/10 6:17:55

默认长按+10.短按+1
在这里插入图片描述
主要难点在区分长按和短按,以1s为界限.这里我使用了四个定时器用于实现加和减的长短按操作.

shortClickTimer定时器用来在鼠标松开的时候判断是否是短按:
如果是短按的话我们需要借助forbidClickTimer定时器短暂禁用Click事件,否则会出现长按松开的时候+10后又+1的情况.
如果不是短按的话需要停止longPressminuxTimer/longPressminuxTimer定时器,这两个定时器如果没有被停止,将会在1s后执行+10/-10的操作(也就是长按后每秒产生的效果).

变量说明:
iStepSize短按的步进
iStartValue最小值
iEndValue最大值
iValue当前值
iLongStepSize长按的步进

import QtQuick 2.2
import QtQuick.Controls 2.2
import QtGraphicalEffects 1.0

Rectangle{
    id:playbackBox
    property int iStepSize: 1
    property int iStartValue: 1
    property int iEndValue: 200
    property int iValue: 1
    property int iLongStepSize: 10
    width: 300
    height:50
    //显示框
    Rectangle{
        anchors.top: parent.top
        anchors.bottom: parent.bottom
        anchors.left: minusBtn.right
        anchors.right: addBtn.left
        border.color: "#CCCCCC"
        border.width: 1
        Text{
            anchors.fill: parent
            text:String(iValue)
            font.pixelSize: 30
            font.weight: Font.Bold
            color: "black"
            horizontalAlignment: Text.AlignHCenter
            verticalAlignment: Text.AlignVCenter
        }
    }
    //+按钮
    Rectangle{
        id:addBtn
        anchors.right: parent.right
        width: parent.height
        height: parent.height
        border.color: "#CCCCCC"
        border.width: 1
        Canvas {
            id:addImg
            anchors.fill: parent
            onPaint: {
                var ctx = getContext("2d")
                //画+
                var x = parent.height / 3;
                var y = parent.height / 2;
                ctx.beginPath()
                ctx.strokeStyle = "rgb(0, 0, 0)";
                ctx.lineWidth = 3
                ctx.moveTo(x, y);
                ctx.lineTo(addImg.width - x, y)
                x = parent.height / 2;
                y = parent.height / 3;
                ctx.moveTo(x, y);
                ctx.lineTo(x, addImg.width - y)
                ctx.stroke()
            }
        }
        //长按+10, 以及规避长按松开后触发onClicked导致再+1问题
        MouseArea{
            anchors.fill: parent
            onPressed: {
                if(!shortClickTimer.running)
                {
                    shortClickTimer.start()
                }

                if(!longPressAddTimer.running)
                {
                    longPressAddTimer.start();
                }
                addBtn.color = "#f0f0f0";
            }
            onReleased: {
                if(!shortClickTimer.running)
                {
                    forbidClickTimer.start();
                }
                longPressAddTimer.stop();
                addBtn.color = "#ffffff";
            }
            onClicked: {
                if(forbidClickTimer.running)
                {
                    return;
                }
                if(iValue >= iEndValue)
                {
                    return;
                }
                iValue += iStepSize;
            }
        }
        Timer{
            id:longPressAddTimer
            running: false
            repeat: true
            interval: 1000
            onTriggered: {
                if(iValue + iLongStepSize > iEndValue)
                {
                    iValue = iEndValue;
                }
                else
                {
                    iValue += iLongStepSize;
                }
            }
        }
    }
    Rectangle{
        id:minusBtn
        anchors.left: parent.left
        width: parent.height
        height: parent.height
        border.color: "#CCCCCC"
        border.width: 1
        Canvas {
            id:minImg
            anchors.fill: parent
            onPaint: {
                var ctx = getContext("2d")
                //画-
                var x = parent.height / 3;
                var y = parent.height / 2;
                ctx.beginPath()
                ctx.strokeStyle = "rgb(0, 0, 0)";
                ctx.lineWidth = 3
                ctx.moveTo(x, y);
                ctx.lineTo(minImg.width - x, y)
                ctx.stroke()
            }
        }
        MouseArea{
            anchors.fill: parent
            onPressed: {
                if(!shortClickTimer.running)
                {
                    shortClickTimer.start()
                }
                if(!longPressminuxTimer.running)
                {
                    longPressminuxTimer.start();
                }
                minusBtn.color = "#f0f0f0";
            }
            onReleased: {
                if(!shortClickTimer.running)
                {
                    forbidClickTimer.start();
                }
                longPressminuxTimer.stop();
                minusBtn.color = "#ffffff";
            }
            onClicked: {
                if(forbidClickTimer.running)
                {
                    return;
                }
                if(iValue <= iStartValue)
                {
                    return;
                }
                iValue -= iStepSize;
            }
        }
        Timer{
            id:longPressminuxTimer
            running: false
            repeat: true
            interval: 1000
            onTriggered: {
                if(iValue - iLongStepSize < iStartValue)
                {
                    iValue = iStartValue;
                }
                else
                {
                    iValue -= iLongStepSize;
                }
            }
        }
        //长按松开后不触发点击事件
        Timer{
            id:forbidClickTimer
            running: false
            repeat: false
            interval: 20
        }
        Timer{
            id:shortClickTimer
            running: false
            repeat: false
            interval: 999
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022最新版-李宏毅机器学习深度学习课程-P22 卷积神经网络CNN

零、吴恩达专项课程引入 概念导入&#xff1a;边缘检测 假如有一张如下的图像&#xff0c;想让计算机搞清楚图像上有什么物体&#xff0c;有两种方法&#xff1a;检测图像的 垂直边缘 和 水平边缘。 如下图所示&#xff0c;一个 6 * 6 的灰度图像&#xff0c;构造一个 3 * 3 …

基于类电磁机制优化的BP神经网络(分类应用) - 附代码

基于类电磁机制优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于类电磁机制优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.类电磁机制优化BP神经网络3.1 BP神经网络参数设置3.2 类电磁机制算法应用 4…

AI绘画使用Stable Diffusion(SDXL)绘制中国古代神兽

一、引言 说到神奇异兽&#xff0c;脑海中首先就会跳出我国古代神话传说中的各种神兽。比如青龙、白虎、朱雀、玄武&#xff0c;再比如麒麟、凤凰、毕方、饕餮等等&#xff0c;这些都是大家耳熟能详的的神兽。 这些神兽不仅体现了人们丰富的创造力和想象力&#xff0c;更是我…

day07_oop

今日内存 1.作业 2.成员变量局部变量 3.构造方法 4.对象创建过程 5.重载 零、复习 昨天 介绍面向对象编程类,属性,方法,对象定义类,设置属性,设置方法,创建对象使用对象,调用属性,调用方法内存图(创建对象,创建多个对象,多个引用指向一个对象) 类和属性,方法的关系 类是模板,其…

CUDA学习笔记3——图像卷积实现

分别采用GPU、CPU对图像进行sobel滤波处理 #include <stdio.h> #include "cuda_runtime.h" #include "device_launch_parameters.h" #include<math.h> #include <malloc.h> #include <opencv2/opencv.hpp>#include <stdlib.h…

DevEco Studio的安装和开发环境配置(详细)

记录一下这段时间备赛金砖职赛的鸿蒙应用开发 下载与安装 下载网址华为开发者联盟-智能终端能力开放,共建开发者生态 (huawei.com) 单击下载 然后跳转到下载的具体版本型号 这里我们选择window版本 下载完解压后 双击运行安装 我们需要找到一个不包含中文的地方&…

文件操作和IO详解

文件操作 和 IO 文件,File 这个概念,在计算机里,也是“一词多用”. 文件的狭义和广义 狭义的文件: 指的是硬盘上的文件和目录(文件夹) 广义的文件: 泛指计算机中很多的软硬件资源.操作系统中,把很多的硬件设备和软件设备都抽象成了文件.按照文件的方式来统一管理.例如网卡,操…

薪资27k,从华为外包测试“跳”入字节,说说我转行做测试的这5年.....

转行测试5年了 当时因为家里催促就业&#xff0c;在其中一个室友的内推下进入了一家英语教培机构&#xff0c;前期上班和工资都还算满意&#xff0c;甚至觉得自己找到了一份很稳定的工作了&#xff0c;可是好景不长&#xff0c;“双减政策”的到来&#xff0c;让公司的经济遭受…

LeetCode1389——按既定顺序创建目标数组

LeetCode1389 思路&#xff1a;先将元素存放在集合中&#xff0c;集合中的add&#xff08;index&#xff0c;value&#xff09;方法可以在指定的位置插入元素。 再创建新的数组&#xff0c;将集合中的元素存入数组&#xff0c;直接用数组的话元素移动不好操作。 public class D…

嵌入式学习笔记(58)程序运行为什么需要内存?

1.1.1.计算机程序运行的目的 程序 代码 数据 代码就是函数&#xff0c;表示加工数据的动作。 数据包括全局变量和局部变量&#xff0c;表示被加工的东西。 程序运行的目的要么重在数据结果&#xff08;有返回值&#xff09;&#xff0c;要么重在过程&#xff08;无返回值…

Java和前端都不好找工作,计算机毕业可以干嘛?

37了&#xff0c;11年多的Java经验&#xff0c;其他什么mysql&#xff0c;linux&#xff0c;Vue等等都会&#xff0c;现在失业在家已经1年多&#xff0c;不指望入职摸鱼了&#xff0c;寻思着转行中。祝你好运 这是某问答社区&#xff0c;有个大四学生提问&#xff0c;好迷茫啊马…

华为云云耀云服务器L实例评测|部署war格式的web项目

目录 准备服务器安装java安装tomcat配置tomcat部署Web Adaptor总结 对于很多刚开始接触编程的朋友&#xff0c;通常都期待自己能部署一个网站&#xff0c;并可以在公网上访问。这就需要一台云服务器。最近发现华为云 推出了 云耀云服务器L实例&#xff0c;使用后&#xff0c;体…

R语言进度条:txtProgressBar功能使用方法

R语言进度条使用攻略 在数据处理、建模或其他计算密集型任务中&#xff0c;我们常常会执行一些可能需要很长时间的操作。 在这些情况下&#xff0c;展示一个进度条可以帮助我们了解当前任务的进度&#xff0c;以及大约还需要多长时间来完成&#xff0c;R语言提供了几种简单且灵…

多模态论文串讲

多模态论文串讲 近几年&#xff0c;尤其是 CLIP 出现以来&#xff0c;多模态学习的发展异常火爆。除了传统的VQA、图文检索、图像描述等&#xff0c;还有受启发于 CLIP 的新任务 Language Guided Detection/Segmentation、文本图像生成、文本视频生成等。本次串讲主要还是围绕…

MATLAB——概率神经网络分类问题程序

欢迎关注“电击小子程高兴的MATLAB小屋” %% 概率神经网络 %% 解决分类问题 clear all; close all; P[1:8]; Tc[2 3 1 2 3 2 1 1]; Tind2vec(Tc) %数据类型的转换 netnewpnn(P,T); Ysim(net,P); Ycvec2ind(Y) %转换回来

机器人力控制构架

在交互过程中&#xff0c;环境会对末端执行器可以遵循的几何路径设置约束。这种情况通常被称为约束运动。在这种情况下&#xff0c;使用纯运动控制策略来控制交互是失败的&#xff01;&#xff01; 只有任务准确规划&#xff0c;使用运动控制才能成功执行与环境的交互任务。但…

10.17数电第二次实验

就是数码管有4个&#xff0c;前两个来表示分钟&#xff0c;后两个表示秒钟 然后下面十六个led灯来记录时间&#xff0c;小时以十六进制&#xff0c;就是说4个二进制&#xff0c;4个灯为一组&#xff0c;一共可以显示四位小时 首先是要接收信号&#xff0c;应该是要无信号&…

任务调度器

题目链接 任务调度器 题目描述 注意点 tasks[i] 是大写英文字母任务可以以任意顺序执行两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间 解答思路 利用桶思想&#xff0c;将不同的字母放进同一个桶中&#xff0c;桶的数量为tasks中字母出现频率最高的次数&#xf…

保序回归与金融时序数据

保序回归在回归问题中的作用是通过拟合一个单调递增或递减的函数&#xff0c;来保持数据点的相对顺序特性。 一、保序回归的作用 主要用于以下情况&#xff1a; 1. 有序数据&#xff1a;当输入数据具有特定的顺序关系时&#xff0c;保序回归可以帮助保持这种顺序关系。例如&…

ai配音怎么弄?推荐一款免费好用的ai配音软件

你们做短视频卡在了哪&#xff1f;剪辑&#xff1f;文案&#xff1f;还是配音&#xff1f;我身边很多朋友都卡在了配音&#xff0c;因为他们都觉得自己的声音不好听&#xff0c;普通话不标准&#xff0c;不够自信&#xff0c;那我们到底该如何解决短视频配音难题呢&#xff1f;…