qml滑动色块


cpp 复制代码
    ColorSlider{id:slider; y:20}

    Rectangle{x:slider.width+10;
        width:60;height:width;radius:3
        color:slider.colorValue; border{width:2;color:Qt.darker(color)}
        Text {anchors.centerIn: parent; text: slider.colorValue}
    }
cpp 复制代码
import QtQuick 2.15
import QtQuick.Controls 2.15


Slider {
    id: slider; width: 400; height: _height
    from: 0.0; to:1.0; value:0.5; padding:0

    property int _height:30
    property color colorValue: Qt.hsla(slider.value, 1.0, 0.5, 1.0)

    handle: Rectangle {
        x: slider.visualPosition * (slider.availableWidth - width)
        y: (slider.availableHeight - height) >> 1
        implicitWidth: _height
        implicitHeight: _height
        radius: _height >> 1
        color: "transparent"
        border{width:3;color: "white"}
    }

    // 背景使用Shader实现彩虹渐变
    background: ShaderEffect {
        width:slider.width; height: _height
        x: 0; y: (slider.availableHeight - height) >> 1
        implicitWidth: slider.width
        implicitHeight: _height

        // 传递圆角参数到着色器
        property real radius: _height >> 1
        property real widthFactor: width
        property real heightFactor: height

        // 顶点着色器传递坐标
        vertexShader: "
            uniform highp mat4 qt_Matrix;
            attribute highp vec4 qt_Vertex;
            attribute highp vec2 qt_MultiTexCoord0;
            varying highp vec2 qt_TexCoord0;
            void main() {
                gl_Position = qt_Matrix * qt_Vertex;
                qt_TexCoord0 = qt_MultiTexCoord0;
            }
        "

        fragmentShader: "
            uniform lowp float qt_Opacity;
            uniform highp float radius;
            uniform highp float widthFactor;
            uniform highp float heightFactor;
            varying highp vec2 qt_TexCoord0;

            vec3 hsv2rgb(vec3 c) {
                vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
                vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
                return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
            }

            // 圆角距离计算
            float roundedBoxSDF(vec2 center, vec2 size, float radius) {
                vec2 q = abs(center) - size + radius;
                return min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - radius;
            }

            void main() {
                // 坐标转换到像素空间
                vec2 pos = qt_TexCoord0 * vec2(widthFactor, heightFactor);
                vec2 center = vec2(widthFactor/2.0, heightFactor/2.0);

                // 计算到圆角矩形的距离
                float d = roundedBoxSDF(pos - center, center, radius);

                // 彩虹色计算
                vec3 hsv = vec3(qt_TexCoord0.x, 1.0, 1.0);
                vec3 rgb = hsv2rgb(hsv);

                // 圆角裁剪:距离>0表示在圆角外,设为透明
                float alpha = d > 0.0 ? 0.0 : 1.0;

                gl_FragColor = vec4(rgb, alpha) * qt_Opacity;
            }
        "
    }
}
相关推荐
Quz10 小时前
QML PathView:吸附对齐与环形轮播
qt
时间的拾荒人10 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
时间的拾荒人13 小时前
Qt 事件机制全解析:从事件处理到事件过滤器
开发语言·qt·面试
时间的拾荒人16 小时前
Qt 窗口系统详解:从菜单栏到对话框的完整指南
开发语言·qt·面试
qq_4017004117 小时前
Qt 炫酷曲线,图表,2D/3D开源库
开发语言·qt
扶尔魔ocy17 小时前
【qt openGL入门笔记】基础光照
qt·opengl
时间的拾荒人18 小时前
Qt 文件操作详解:从基础类到读写实战
开发语言·qt·面试
扶尔魔ocy1 天前
【qt openGL入门笔记】坐标系统和摄像机
qt·opengl
C++ 老炮儿的技术栈1 天前
main函数之后的调用
c语言·c++·人工智能·qt·mfc·c
沫璃染墨2 天前
《Qt从零入门系列(十二):Qt文件操作详解——从QFile读写到QFileInfo与记事本实战》
开发语言·网络·c++·qt·交互·信号处理·文件