QML输入控件: Slider的高级外观定制(音视频控制条)

news2025/4/25 21:45:34

目录

    • 引言
    • 相关阅读
    • 示例1:基础样式定制
      • 要点
      • 效果
    • 示例2:音量控制滑块
      • 要点
      • 效果
    • 示例3:视频进度条
      • 要点
      • 效果
    • 解决问题
    • 总结
    • 工程下载

引言

在现代用户界面设计中,滑块控件(Slider)是一个不可或缺的交互元素。它不仅能让用户直观地进行数值调节,还能通过精心的设计为应用增色不少。本文将通过三个实用的例子,展示如何在QML中对Slider控件进行深度定制,打造出独具特色的用户界面效果。

相关阅读

  • QML输入控件: Slider的基础用法与样式

示例1:基础样式定制

该展示了如何创建一个基础的自定义样式滑块:

// SliderStyle3.qml
import QtQuick
import QtQuick.Controls
import QtQuick.Controls.Basic
import Qt5Compat.GraphicalEffects

Window {
    width: 400
    height: 300
    visible: true
    title: qsTr("Slider - 自定义样式")
    color: "#2c3e50"

    Column {
        anchors.centerIn: parent
        spacing: 20

        // 值显示
        Text {
            anchors.horizontalCenter: parent.horizontalCenter
            text: Math.round(customSlider.value)
            color: "#ecf0f1"
            font.pixelSize: 18
        }

        // 滑块
        Slider {
            id: customSlider
            width: 300
            height: 40
            from: 0
            to: 100
            value: 50

            // 背景轨道
            background: Rectangle {
                x: customSlider.leftPadding
                y: customSlider.topPadding + customSlider.availableHeight / 2 - height / 2
                width: customSlider.availableWidth
                height: 4
                radius: 2
                color: "#34495e"

                // 已完成部分
                Rectangle {
                    width: customSlider.visualPosition * parent.width
                    height: parent.height
                    color: "#2ecc71"
                    radius: 2
                }
            }

            // 手柄
            handle: Rectangle {
                x: customSlider.leftPadding + customSlider.visualPosition * (customSlider.availableWidth - width)
                y: customSlider.topPadding + customSlider.availableHeight / 2 - height / 2
                width: 20
                height: 20
                radius: 10
                color: customSlider.pressed ? "#13a333" : "#ecf0f1"
                border.color: "#2ecc71"
                border.width: 2

                // 手柄动画
                Behavior on color {
                    ColorAnimation { duration: 100 }
                }
            }
        }
    }
}

要点

  • 使用Rectangle自定义背景轨道和手柄
  • 通过visualPosition属性控制进度条显示
  • 添加按压状态动画效果
  • 采用扁平化设计风格

效果

slider style


示例2:音量控制滑块

第二个示例展示了一个实用的音量控制滑块:

// SliderAudio.qml
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts

Window {
    width: 400
    height: 300
    visible: true
    title: qsTr("Slider - 音量控制")
    color: "#1e1e2e"

    RowLayout {
        anchors.centerIn: parent
        width: parent.width * 0.8
        spacing: 10

        // 音量图标
        Image {
            id: volumeIcon
            source: volumeSlider.value <= 0 ? "/icons/mute.png" : "/icons/volume.png"
            width: 24
            height: 24
            Layout.alignment: Qt.AlignVCenter

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    if (volumeSlider.value > 0) {
                        volumeSlider.lastValue = volumeSlider.value
                        volumeSlider.value = 0
                    } else {
                        volumeSlider.value = volumeSlider.lastValue || 50
                    }
                }
            }
        }

        // 音量滑块
        Slider {
            id: volumeSlider
            Layout.fillWidth: true
            padding: 0
            property real lastValue: 50

            from: 0
            to: 100
            value: 60
            stepSize: 1
            live: true

            // 自定义背景
            background: Rectangle {
                x: volumeSlider.leftPadding
                y: volumeSlider.topPadding + (volumeSlider.availableHeight - height) / 2
                width: volumeSlider.availableWidth
                height: 8
                radius: 4
                color: "#313244"

                // 音量进度条
                Rectangle {
                    width: volumeSlider.visualPosition * parent.width
                    height: parent.height
                    radius: 4
                    gradient: Gradient {
                        orientation: Gradient.Horizontal
                        GradientStop { position: 0.0; color: "#89b4fa" }
                        GradientStop { position: 1.0; color: "#cba6f7" }
                    }
                }
            }

            // 自定义手柄
            handle: Rectangle {
                x: volumeSlider.leftPadding + volumeSlider.visualPosition * (volumeSlider.availableWidth - width)
                y: volumeSlider.topPadding + volumeSlider.availableHeight / 2 - height / 2
                width: 16
                height: 16
                radius: 8
                color: volumeSlider.pressed ? "#cba6f7" : "#f9f9f9"
                border.color: "#89b4fa"
                border.width: 2

                // 添加鼠标区域以确保可以拖动
                MouseArea {
                    anchors.fill: parent
                    cursorShape: Qt.PointingHandCursor
                    drag {
                        target: parent
                        axis: Drag.XAxis
                        minimumX: 0
                        maximumX: volumeSlider.availableWidth - parent.width
                    }
                    onPositionChanged: {
                        if (drag.active) {
                            volumeSlider.value = (parent.x / (volumeSlider.availableWidth - parent.width)) * (volumeSlider.to - volumeSlider.from)
                        }
                    }
                }
            }
        }

        // 音量值显示
        Text {
            text: Math.round(volumeSlider.value) + "%"
            color: "#cdd6f4"
            font.pixelSize: 14
            Layout.alignment: Qt.AlignVCenter
            Layout.preferredWidth: 40
        }
    }
} 

要点

  • 集成音量图标、滑块和数值显示
  • 实现静音切换功能
  • 使用渐变色提升视觉效果
  • 添加百分比显示

效果

Slider Audio


示例3:视频进度条

第三个示例展示了一个专业的视频进度控制器:

// SliderVideo.qml  代码太长,展示核心代码
ColumnLayout {
    // 时间显示
    RowLayout {
        Text { text: formatTime(currentTime) }
        Text { text: formatTime(videoSlider.to) }
    }
    
    Slider {
        id: videoSlider
        
        background: Rectangle {
            // 缓冲进度
            Rectangle {
                width: parent.width * 0.7
                color: "#565f89"
            }
            
            // 播放进度
            Rectangle {
                width: videoSlider.visualPosition * parent.width
                gradient: Gradient {
                    GradientStop { position: 0.0; color: "#7aa2f7" }
                    GradientStop { position: 1.0; color: "#bb9af7" }
                }
            }
        }
    }
    
    // 控制按钮
    RowLayout {
        Repeater {
            model: controlButtons
            delegate: Rectangle {
                // 播放、快进、快退按钮
            }
        }
    }
}

要点

  • 实现完整的视频播放控制功能
  • 显示缓冲进度和播放进度
  • 集成播放控制按钮
  • 时间格式化显示
  • 使用Timer实现播放功能

效果

Slider Video


解决问题

运行时遇到报错:

The current style does not support customization of this control (property: “handle” item: QQuickRectangle(0x1e87663c1b0, parent=0x0, geometry=0,0 12x12)). Please customize a non-native style (such as Basic, Fusion, Material, etc). For more information, see: https://doc.qt.io/qt-6/qtquickcontrols2-customize.html#customization-reference

解决方法:

import QtQuick.Controls.Basic


总结

通过这三个示例,我们展示了QML Slider控件的强大定制能力:

  1. 基础样式定制:展示了如何从零开始定制Slider的外观
  2. 音量控制:结合实际应用场景,实现了完整的音量控制功能
  3. 视频进度条:展示了复杂业务场景下的综合应用

这些示例不仅展示了控件的定制方法,更重要的是展示了如何将控件与实际业务需求相结合,打造出既美观又实用的用户界面。

工程下载

完整代码已上传至GitCode,您可以通过以下链接获取:QML Slider Examples
GitCode

项目包含:

  • 完整的 CMake 构建配置
  • 所有示例的 QML 源文件
  • 示例中使用的图标资源

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

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

相关文章

密码学基础——古典密码学

目录 一、定义 特点&#xff1a; 二、发展阶段 三、代换密码 1.单表代换密码 1.1恺撒密码 1.2 移位变换 1.3 仿射变换 2.多表代换密码 维吉尼亚密码 四、置换密码 栅栏密码 一、定义 古典密码学是指在现代密码学出现之前&#xff0c;使用较为简单的数学方法和手工…

KingbaseES物理备份还原之备份还原

此篇续接上一篇<<KingbaseES物理备份还原之物理备份>>,上一篇写物理备份相关操作,此篇写备份还原的具体操作步骤. KingbaseES版本:V009R004C011B003 一.执行最新物理备份还原 --停止数据库服务,并创建物理备份还原测试目录 [V9R4C11B3192-168-198-198 V8]$ sys_ct…

jdk21新特性详解使用总结

jdk21新特性详解总结 1.StringBuilder和StringBuffer新增了一个repeat方法 /*** Java 21的StringBuilder和StringBuffer新增了一个repeat方法*/public static void repeatStr(){var sbnew StringBuilder().repeat("*",10);System.out.println(sb);}运行结果如下&…

【实用技巧】电脑重装后的Office下载和设置

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言下载设置总结互动致谢参考目录导航 前言 在数字化办公时代&#xff0c;Windows和…

206. 反转链表 92. 反转链表 II 25. K 个一组翻转链表

leetcode Hot 100系列 文章目录 一、翻转链表二、反转链表 II三、K 个一组翻转链表总结 一、翻转链表 建立pre为空&#xff0c;建立cur为head&#xff0c;开始循环&#xff1a;先保存cur的next的值&#xff0c;再将cur的next置为pre&#xff0c;将pre前进到cur的位置&#xf…

离线语音识别 ( 小语种国家都支持)可定制词组

1产品介绍 离线语音模组采用神经网络算法&#xff0c;支持语音识别、自学习等功能。运用此模组将 AI 技 术赋能产品&#xff0c;升级改造出语音操控的智能硬件 ( 例如风扇、台灯、空调、马桶、按摩椅、运 动相机、行车记录仪等 ) 。支持全球多种语言识别&#xff0c;如中文…

网络华为HCIA+HCIP 策略路由,双点双向

目录 路由策略&#xff0c;策略路由 策略路由优势 策略路由分类 接口策略路由 双点双向 双点双向路由引入特点: 联系 路由回灌和环路问题 路由策略&#xff0c;策略路由 路由策略:是对路由条目进行控制&#xff0c;通过控制路由条目影响报文的转发路径&#xff0c;即路…

【TI MSPM0】ADC DAC学习

一、样例展示 通过ADC0触发单次采样&#xff0c;如果采样结果大于0.5倍的VDD&#xff0c;就点亮LED 否则熄灭LED 编译加载运行这个历程&#xff0c;提供一个电压到A0_2引脚上,电压范围在0-VCC之间同时观察LED1.在上电后&#xff0c;默认将ADC配置到正确的引脚模式&#xff0c;…

Cesium系列:从入门到实践,打造属于你的3D地球应用

一、Cesium简介 CesiumJS 是一个开源的 JavaScript 库&#xff0c;它能够帮助开发者创建出具有卓越性能、高精度、出色视觉质量和易用性的世界级 3D 地球仪和地图。无论是在航空航天领域&#xff0c;用于模拟飞行路径和展示卫星数据&#xff1b;还是在智能城市中&#xff0c;用…

Linux系统程序设计:从入门到高级Day01

知识点1 【系统调用】 系统调用的概述 系统调用&#xff1a;内核 提供给 用户 可以 操作内核 的一组函数接口 关系&#xff1a;用户 借助 系统调用 操作内核 进程的空间分为&#xff1a;内核空间 和 用户空间 用户一般都是在用户空间操作的&#xff0c;但是有的时候用户需要…

openEuler24.03 LTS下安装HBase集群

前提条件 安装好Hadoop完全分布式集群&#xff0c;可参考&#xff1a;openEuler24.03 LTS下安装Hadoop3完全分布式 安装好ZooKeeper集群&#xff0c;可参考&#xff1a;openEuler24.03 LTS下安装ZooKeeper集群 HBase集群规划 node2node3node4MasterBackup MasterRegionServ…

关于testng.xml无法找到类的问题

问题&#xff1a;testng.xml添加测试类的时候飘红 解决办法&#xff1a; 1.试图通过自动生成testng.xml插件去解决&#xff0c;感觉也不是这个问题&#xff0c;没有尝试&#xff1b; 2.以为是创建包的方式不对&#xff0c;重新删除后新建--还是找不到 想新建类的时候发现从m…

数据结构:探秘AVL树

本节重点 理解AVL树的概念掌握AVL树正确的插入方法利用_parent指针正确更新平衡因子掌握并理解四种旋转方式&#xff1a;左单旋&#xff0c;右单旋&#xff0c;左右双旋&#xff0c;右左双旋 一、AVL树的概念 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&…

Linux 入门:基础开发工具(上)vim,gcc/g++,make/makefile

目录 一.软件包管理器 一&#xff09;.软件包 二&#xff09;.安装软件 三&#xff09;.删除软件 二.编辑器vim 一&#xff09;.vim的基本介绍 1.正常/普通/命令模式(Normal mode) 2.插入模式(Insert mode) 3.底行模式(last line mode) 二&#xff09;.vim的基本操作 …

5、无线通信基站的FPGA实现架构

基站&#xff08;Base Station&#xff0c;BS&#xff09;&#xff0c;也称为公用移动通信基站&#xff0c;是无线电台站的一种形式&#xff0c;具体则指在一定的无线电覆盖区中&#xff0c;通过移动通信交换中心&#xff0c;与移动电话终端之间的信息传递的无线电收发信电台。…

Linux2 CD LL hostnamectl type mkdir dudo

查看主机名信息 设置静态主机名 同时配置静态、瞬时主机名 下载Vmware tools https://blog.csdn.net/qq_34638161/article/details/102779721 mkdir创建目录 问题&#xff1a;为什么在root目录下 看不到 /var /usr那些文件夹

Docker容器部署Java项目的自动化脚本(Shell编写)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Docker容器部署Java项目的自动化脚本&#x…

STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出

目录 前言 输出时的GPIO控制部分 标准库是如何操作寄存器完成GPIO驱动的初始化的&#xff1f; 问题1&#xff1a;如何掌握GPIO的编程细节——跟寄存器如何打交道 问题2&#xff1a;哪些寄存器&#xff0c;去哪里找呢&#xff1f; 问题三&#xff0c;寄存器的含义&#xff…

UniApp集成极光推送详细教程

最近项目要集成推送服务&#xff0c;选型极光推送&#xff0c;记录一下开发过程。 1、极光官网注册登录 1.1选择极光推送产品&#xff0c;新建应用 1.2在下一步中选择Android/IOS的消息推送服务 1.3产品设置中输入应用包名&#xff08;一经输入后不可更改&#xff0c;一定要正…

AI战略群与星际之门:软银AI投资版图计划深度解析

一、星际之门:万亿美元级 AI 基础设施革命 1.1 项目背景与战略定位 在 AI 技术迅猛发展的今天,算力已成为推动其前进的核心动力。软银联合 OpenAI、甲骨文、英伟达、微软、arm推出的 “星际之门”(Stargate)计划,无疑是 AI 领域的一颗重磅炸弹。作为 AI 领域史上最大单笔…