023-第三代软件开发-自定义Button

头图

第三代软件开发-自定义Button

文章目录

  • 第三代软件开发-自定义Button
    • 项目介绍
    • 自定义Button
      • 第一类型-加声音
      • 第二类型-加样式
    • 第三类型-减声音
    • 总结一下
      • 存在一点小问题

关键字: QtQmlButton关键字4关键字5

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

自定义Button

大家有没有这样的场景,一个页面有很多个样式一致的Button,他们有很多内容都是相同的,如果我们去实现他,按照传统的方法,那就是复制、粘贴、粘贴、粘贴,是不是?

那么如果我们把这些共同的东西,抽象出来,整个一个基类呢,是不是就可以不用粘贴、粘贴、粘贴呢了。

在或者,我们需要的某些功能基础的Button不能满足呢,所以就有了自定义Button的需求了。目前我的代码里面有三个类型的Button,这里分享一下

第一类型-加声音

import QtQml 2.14 as Qml
import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Controls.Private 1.0
import QtMultimedia 5.15
/**
  重写Button,主要为了按钮按下时有声音
  其次,这是第一代Qml Button,为了使用里面的样式和排他属性
  其他地方尽量使用新的Button
 */
Button
{
    id:root
    SoundEffect {
        id: playSound
        source: "qrc:/Audio/T_Resource/T_Audio/T_Base/buttonTach.wav"
    }
    onClicked: playSound.play()
}

这个是最简单了吧,就是一个正常的Button,我给他加了一个播放声音的选项,并且在按钮对应的Clicked事件中触发了声音的播放,这里为啥没有用MediaPlayer,咱们前面也说过了,提示应,用SoundEffect才是正确的路子。

第二类型-加样式

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtMultimedia 5.15
/**
 重写Button,主要为了按钮按下时有声音
*/
Button
{
    id:root
    font.pointSize: 14
    property string source: ""
    background: Rectangle{
        anchors.fill: parent
        color: root.checked ?  "#00FF00"  : (root.pressed ? "#FFB743" :"#44ADA5")
        Image {
            anchors.fill: parent
            source: root.source
        }
    }
    contentItem: Text {
        text: root.text
        font: root.font
        opacity: enabled ? 1.0 : 0.3
        color: root.checked ?  "#000000"  : (root.pressed ? "#000000" :"#FFFFFF")
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
        elide: Text.ElideRight
    }

    SoundEffect {
        id: playSound
        source: "qrc:/Audio/T_Resource/T_Audio/T_Base/buttonTach.wav"
    }
    onClicked: playSound.play()
}

第二个版本,就是在第一个的版本上面加上了样式,说道样式,这里又不得不说百度了,这个问题大家可以百度到多个版本,但是那个是正确的,哪个是合理的,没有人给出解释,因为在当时的环境下就是合理的,这里我推荐大家还是直接看帮助文档,那是最合理的法子,那么我这里分享的仅仅是Qt 5.15.2 下Qt帮助文档中的法子,这个是基于Quick 2 的路子。

import QtQuick 2.12
import QtQuick.Controls 2.12

 Button {
     id: control
     text: qsTr("Button")

     contentItem: Text {
         text: control.text
         font: control.font
         opacity: enabled ? 1.0 : 0.3
         color: control.down ? "#17a81a" : "#21be2b"
         horizontalAlignment: Text.AlignHCenter
         verticalAlignment: Text.AlignVCenter
         elide: Text.ElideRight
     }

     background: Rectangle {
         implicitWidth: 100
         implicitHeight: 40
         opacity: enabled ? 1 : 0.3
         border.color: control.down ? "#17a81a" : "#21be2b"
         border.width: 1
         radius: 2
     }
 }

可对比下Quick 1 中的路子

 Button {
     text: "A button"
     style: ButtonStyle {
         background: Rectangle {
             implicitWidth: 100
             implicitHeight: 25
             border.width: control.activeFocus ? 2 : 1
             border.color: "#888"
             radius: 4
             gradient: Gradient {
                 GradientStop { position: 0 ; color: control.pressed ? "#ccc" : "#eee" }
                 GradientStop { position: 1 ; color: control.pressed ? "#aaa" : "#ccc" }
             }
         }
     }
 }

而我想说的是这两种路子在百度里面都有,但是却没有人告诉你为什么,你也好奇,为啥有的是style,有的却不是。

第三类型-减声音

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtMultimedia 5.15
/**
 重写Button,主要为了按钮按下时有声音
*/
Button
{
    id:root
    font.pointSize: 14
    property string source: ""
    background: Rectangle{
        anchors.fill: parent
        color: root.checked ?  "#00FF00"  : (root.pressed ? "#FFB743" :"#44ADA5")
        Image {
            anchors.fill: parent
            source: root.source
        }
    }
    contentItem: Text {
        text: root.text
        font: root.font
        opacity: enabled ? 1.0 : 0.3
        color: root.checked ?  "#000000"  : (root.pressed ? "#000000" :"#FFFFFF")
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
        elide: Text.ElideRight
    }
}

第三种也很好理解,就是在第一种的基础上,把声音去掉。因为有的按钮不需要声音。

总结一下

这里我根据自己的需求,把按钮分成了3个类型的按钮,分别实现,同样,我也可以这些合成一种按钮,完了在内部通过属性区分,所以程序的世界里面真的是条条大路同罗马,就看那个更适合。没有最好,只有最适合。

存在一点小问题

大家看到,我在第一个类型和第二个类型中是有一个SoundEffect的模块的,如果我这么写会发生什么,嘿嘿,聪明的你是不是发现问题了,这个SoundEffect会伴随我的按钮的创建出一堆了,如果你碰巧用的也是ubuntu 系统开发,那可以到声音控制下面看看,是不是多出一堆音轨来,虽然在当下没有什么问题,不过我也不知道在未来会不会存在问题,也考虑使用一个指针,但是如果一个对象的话,那同时就只能播放一种声音了,所以,在当下,我认为他是合适的。后期随着需求再说。


博客签名2021

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis缓存(缓存预热,缓存穿透,缓存雪崩,缓存击穿)

目录 一, 缓存 1, 什么是缓存 2, 什么是热点数据(热词) 3, 缓存更新策略 3.1 定期生成 3.2 实时生成 二, Redis缓存可能出现的问题 1, 缓存预热 1.1 什么是缓存预热 1.2 缓存预热的过程 2, 缓存穿透 2.1 什么是缓存穿透 2.2 缓存穿透产生的原因 2.3 缓存穿透的解…

优思学院|中质协六西格玛考试形式是什么样的?

中质协的考试形式主要为单选和多选题,近年也有加了一小部分填空题,和国际认证考试有很大区别,因为美质协(ASQ)、国际精益六西格玛研究所(ILSSI),又或者著名的PMP项目管理认证等都是采…

Java性能分析工具

Arthas 官网:简介 | arthas Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业…

Spark SQL概述与基本操作

目录 一、Spark SQL概述 (1)概念 (2)特点 (3)Spark SQL与Hive异同 (4)Spark的数据抽象 二、Spark Session对象执行环境构建 (1)Spark Session对象 (2)代码演…

【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容(一)自定义门控循环单元(GRU,Gated Recurrent Unit)1. get_params2. init_gru_state3. gru (二)创建模型0. 超参数…

3. 博弈树 (15分)

下棋属于一种博弈游戏,博弈过程可以用树(博弈树)来表示。假设游戏由两个人( A 和 B )玩,开始由某个人从根结点开始走,两个人轮流走棋,每次只能走一步, 下一步棋只能选择当…

OTA语音芯片NV040C在智能电动牙刷的应用

以往我们对牙齿的清洁是使用的是手动方式进行,用柔软的牙刷刷毛去进行牙齿的清洁。但现在我们拥有了一种新颖的刷牙方式,靠电力去驱动、清洁我们的牙齿。电动牙刷的刷头通过快速旋转,产生高频振动,将牙膏迅速分解为细小的泡沫&…

支付宝支付接入流程

一、 接入准备 支付宝支付流程没有微信那么复杂,而且支付宝支持沙箱。登录支付宝开放平台控制台 点击开发工具中的沙箱 接口加密方式,我这里使用的是自定义密钥。生成密钥的方式 使用支付宝官方提供的密钥工具,唯一要注意的是支付宝密钥工具…

idea + Docker-Compose 实现自动化打包部署(仅限测试环境)

一、修改docker.service文件,添加监听端口 vi /usr/lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock重启docker服务 systemctl daemo…

线性代数3:矢量方程

一、前言 欢迎回到系列文章的第三篇文章,内容是线性代数的基础知识,线性代数是机器学习背后的基础数学。在我之前的文章中,我介绍了梯队矩阵形式。本文将介绍向量、跨度和线性组合,并将这些新想法与我们已经学到的内容联系起来。本…

基于 Redis + Lua 脚本实现分布式锁,确保操作的原子性

1.加锁的Lua脚本: lock.lua --- -1 failed --- 1 success--- getLock key local result redis.call(setnx , KEYS[1] , ARGV[1]) if result 1 then--PEXPIRE:以毫秒的形式指定过期时间redis.call(pexpire , KEYS[1] , 3600000) elseresult -1;-- 如果value相同&…

数据清洗(data clean)

整理了下数据清洗的基本流程,异常值部分整理在了EDA中。

什么是简单网络管理协议(SNMP)

简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP&#xf…

React中的Virtual DOM(看这一篇就够了)

文章目录 前言了解Virtual DOMreact创建虚拟dom的方式React Element虚拟dom的流程虚拟dom和真实dom的对比后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:react合集 🐱‍👓博主在前端领域还有很多知识和技术需要掌…

DevOps持续集成-Jenkins(3)

文章目录 DevOpsDevOps概述Jenkins实战3:实战1和实战2的加强版(新增SonarQube和Harbor)⭐环境准备⭐项目架构图对比Jenkins实战1和实战2,新增内容有哪些?SonarQube教程采用Docker安装SonarQube (在Jenkins所…

生成树协议:监控 STP 端口和交换机

什么是生成树协议 生成树协议 (STP) 用于网络交换机,以防止循环和广播风暴。在局域网 (LAN) 中,两条或多条冗余路径可以连接到同一网段。当交换机或网桥从所有可用端口传输帧时,这些帧开始在网…

基于单片机设计的智能窗帘控制系统

一、前言 智能家居技术在近年来取得了巨大的发展,并逐渐成为人们日常生活中的一部分。智能家居系统带来了便利、舒适和高效的生活体验,拥有广泛的应用领域,其中之一就是智能窗帘控制系统。 传统窗帘需要手动操作,打开或关闭窗帘…

华硕天选1天选2天选3天选4天选air原厂预装出厂系统恢复安装教程方法

华硕天选1天选2天选3天选4天选air原厂预装出厂系统恢复安装教程方法 第一:自备原装swm/esd/wim/iso等格式系统文件,以上这几种格式文件安装恢复非常简单,使用PE工具即可完成恢复安装,还有一种安装方法就是华硕zip工厂恢复模式 1.首先需要自…

Adaptive AUTOSAR RTA-VRTE工具链介绍

ETAS Adaptive AUTOSAR RTA-VRTE是一种面向服务架构的中间件方案,提供了自适应AutoSAR平台,为应用层软件提供了运行环境. RTA-VRTE start kit的构建系统在主机VM内执行,可以创建AUTOSAR自适应应用程序并将其部署到一个或多个目标ECU虚拟机.

【VPX610】 青翼科技基于6U VPX总线架构的高性能实时信号处理平台

板卡概述 VPX610是一款基于6U VPX架构的高性能实时信号处理平台,该平台采用2片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元,采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元,具有2个FMC子卡接口,各个处理节点之…