当前位置: 首页 > news >正文

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

目录

    • 引言
    • 相关阅读
    • 示例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.dtcms.com/a/106561.html

相关文章:

  • 接口测试及常用接口测试工具
  • 【C语言】深入理解指针(五):sizeof、strlen与数组指针的那些事儿
  • 【学Rust写CAD】26 图形像素获取(pixel_fetch.rs)
  • 红日靶场一实操笔记
  • C++ QT 如何生成dll提供給python使用
  • 星途​(小说)
  • 零欧姆电阻的作用、使用场景及注意事项详解
  • PyTorch 核心详解
  • 第六章、Isaacsim中的资产(usd)
  • 【嵌入式系统设计师】知识点:第1章 计算机系统基础知识
  • 方案精读:IPD业务流程体系构建(中)【附全文阅读】
  • 介绍一点metric self-join和复合索引笔记
  • 数组中两个字符串的最小距离
  • 【深度学习量化交易19】行情数据获取方式比测(1)——基于miniQMT的量化交易回测系统开发实记
  • CCF CSP 第34次(2024.06)(2_矩阵重塑(其二)_C++)(二维矩阵 -> 一维矩阵 -> 二维矩阵)
  • 【万字总结】前端全方位性能优化指南(九)——FSP(First Screen Paint)像素级分析、RUM+合成监控、Lighthouse CI
  • 蓝桥杯C++基础算法-最大公约数
  • 论文阅读:基于增强通用深度图像水印的混合篡改定位技术 OmniGuard
  • 电池自动点焊机:智能制造的得力助手|深圳比斯特自动化
  • 普通链式二叉树(习题版)
  • 脑影像分析软件推荐| SimTB
  • WireShark安装
  • BigMusic来了:火山引擎AI音乐模型的技术革新与应用实践
  • MySQL 错误 报错:Table ‘performance_schema.session_variables’ Doesn’t Exist
  • Doris:打破 SQL 方言壁垒,构建统一数据查询生态
  • TensorFlow 字符串操作
  • Uubuntu20.04复现SA-ConvONet步骤
  • 【2025】物联网发展趋势介绍
  • 制造业数字化转型:智能招聘系统破解蓝领用工匹配难题?
  • MySQL学习笔记集--简单介绍以及下载途径