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;
            }
        "
    }
}
相关推荐
雾岛听蓝44 分钟前
Qt开发核心笔记:从HelloWorld到对象树内存管理与坐标体系详解
开发语言·经验分享·笔记·qt
blog_wanghao13 小时前
基于Qt的串口调试助手
开发语言·qt
Sss_Ass20 小时前
在Qt Creator创建并编写第一个程序
开发语言·qt
jf加菲猫1 天前
第12章 数据可视化
开发语言·c++·qt·ui
咸鱼翻身小阿橙1 天前
QT总结-P2
开发语言·qt
雪的季节1 天前
QT QPointer 解析
开发语言·qt
老歌老听老掉牙2 天前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
A.A呐2 天前
【QT第六章】界面优化
开发语言·qt
sycmancia2 天前
Qt——布局管理器(一)
前端·qt
AlanW2 天前
QT 信号槽内部实现原理深度解析
qt