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;
            }
        "
    }
}
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能15 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G15 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt