qt - QML 圆规

标签 qt qml gradient opacitymask

我目前正在创建一个虚拟仪表板,我想获取针后面的进度条类型,如以下链接所示:https://forum.qt.io/topic/89307/qml-circular-gauge-styling-needle-trailing-colour-glow .

到目前为止,我只使用 Canvas 完成了针状进度条。我不明白如何使用 conicalGradient 和不透明蒙版来实现 我需要的效果。

import QtQuick 2.9
import QtQuick.Window 2.2
import QtGraphicalEffects 1.0

ApplicationWindow 
{

    id:root
    visible: true
    width: 1024
    height: 600
    property int external_width: 534
    property int external_height: 533
    property bool external_reverse: false
    property int external_angle: 0
    property int externalstart_angle: 138 //138
    property int external_angle_limit: 360//264
    property int external_radius: 235
    property int external_lineWidth: 60

    Canvas {
        id: external_progress_bar
        width: root.external_width
        height: root.external_height
        x: (root.width - width)/2
        y: (root.height - height)/2
        property real angle: 260
        property real nextAngle: (Math.PI/180)*angle
        property color col: "red"
        onPaint: {
            var ctx = getContext("2d");
            ctx.reset();
            ctx.beginPath();
            ctx.arc(width/2, height/2, root.external_radius, (Math.PI/180) * root.externalstart_angle,(Math.PI/180) * root.externalstart_angle + nextAngle, root.center_reverse);
            ctx.lineWidth = root.external_lineWidth
            ctx.strokeStyle = col
            ctx.stroke()
        }
    }
}

我将非常感谢带有解释的示例代码。

最佳答案

您可以使用 ConicalGradientOpacityMask

使用不同的颜色创建相同的 Canvas 。然后,使用从透明到白色的 ConicalGradient 和蒙版来减少 Canvas 上的绘制区域:

Canvas {
        id: external_progress_bar
        ...
         visible: false // Not visible (it will be painted by the mask)
    }

    ConicalGradient {
        id: progress
            anchors.fill: external_progress_bar
            angle: 45.0 // Change this angle to move the gradient effect
            gradient: Gradient {
                GradientStop { position: 0.0; color: "transparent" }
                GradientStop { position: 0.1; color: "white" } // Just a part of the canvas
            }
             visible: false // Not visible (it will be painted by the mask)
    }
    OpacityMask {
            anchors.fill: progress
            source: external_progress_bar
            maskSource: progress
            invert: true
        }

您将得到:

Example

有关 OpacityMask 的更多说明,请参阅 Qt documentation

关于qt - QML 圆规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55657605/

相关文章:

qt - 如何从另一个 QML 访问和控制 ListModel 的内容

c++ - 在 Qt5 中使用 sqlite

c++ - ldd 神奇地找到了一个 libQtCore

android - 连接 QML 和 Qt

python - 如何使用 PySide2 在 qml 中设置值?

javascript - Qt Qml Javascript - 在哪里使用哪个?

c++ - Qt Qvariantlist转换成javascript数组不成功

python - 使用 numpy 绘制圆形渐变

Javascript 颜色渐变均匀 split ,从蓝色到灰色再到红色

安卓扫描渐变