cmake 在QML中突出显示圆段的最佳方法是什么?

hc8w905p  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(158)

我对QML还很陌生,我想做一个基本的应用程序,它由一个20-30段的分段圆(比萨饼片)和一个计数器组成。计数器上的数字是被突出显示的段的数量。我在其他问题中找到了一些制作分段圆的方法,但不幸的是,它们似乎都不适合我的任务。
我认为现在唯一的方法是在每次计数器改变时重新绘制所有的段,并改变所需段的颜色。那么有没有一个最佳的方法来实现这一点呢?

col17t5w

col17t5w1#

为了降低复杂性,让我们来解决这个问题的简化版本:

  • 假设有6件
  • 假设我们要绘制片段2
  • 假设我们要将其放入一个300 x300的矩形

下面是数学:

  • 每一部分将占据60度(即360 / 6)
  • 第2部分将占据120至180的Angular

要渲染作品,图纸将:

  • 从中心点(150、150)
  • 然后(150 + 150 * cos(120),150 + 150 * sin(120))
  • 然后(150 + 150 * cos(180),150 + 150 * sin(180))
  • 然后回到中心点(150,150)

我们要在点2和点3之间绘制一条曲线,而不是直线。
为了渲染这个,我们可以使用ShapeShapePathPathLinePathArc
为了推广,我们可以用20来代替6,并相应地推广所有公式。

Repeater {
        model: 20
        PizzaPiece {
            piece: index
        }
    }

为了润色它,我添加了一个Slider,这样你就可以交互式地在0-20之间更改你想要的片数,并将颜色设置为"orange",否则它将是浅黄色"#ffe"

Repeater {
        model: 20
        PizzaPiece {
            piece: index
            fillColor: index < slider.value ? "orange" : "#ffe"
        }
    }
    Slider {
        id: slider
        from: 0
        to: 20
        stepSize: 1
    }

作为额外的奖励,我添加了一个TapHandler,这样每一块都是可点击的。如果你让鼠标按下,这块将显示“红色”,直到你释放鼠标。

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Page {
    id: page
    property int pieces: 20
    Rectangle {
        anchors.centerIn: parent
        width: 300
        height: 300
        border.color: "grey"
        Repeater {
            model: pieces
            PizzaPiece {
                anchors.fill: parent
                anchors.margins: 10
                pieces: page.pieces
                piece: index
                fillColor: pressed ? "red" : index < slider.value ? "orange" : "#ffe"
                onClicked: {
                    slider.value = index + 1;
                }
            }
        }
    }
    footer: Frame {
        RowLayout {
            width: parent.width
            Label {
                text: slider.value
            }
            Slider {
                id: slider
                Layout.fillWidth: true
                from: 0
                to: pieces
                value: 3
                stepSize: 1
            }
        }
    }
}

//PizzaPiece.qml
import QtQuick
import QtQuick.Shapes

Shape {
    id: pizzaPiece
    property int pieces: 20
    property int piece: 0
    property real from: piece * (360 / pieces)
    property real to: (piece + 1) * (360 / pieces)
    property real centerX: width / 2
    property real centerY: height / 2
    property alias fillColor: shapePath.fillColor
    property alias strokeColor: shapePath.strokeColor
    property alias pressed: tapHandler.pressed
    property real fromX: centerX + centerX * Math.cos(from * Math.PI / 180)
    property real fromY: centerY + centerY * Math.sin(from * Math.PI / 180)
    property real toX: centerX + centerX * Math.cos(to * Math.PI / 180)
    property real toY: centerY + centerY * Math.sin(to * Math.PI / 180)
    signal clicked()
    containsMode: Shape.FillContains
    ShapePath {
        id: shapePath
        fillColor: "#ffe"
        strokeColor: "grey"
        startX: centerX; startY: centerY
        PathLine { x: fromX; y: fromY }
        PathArc {
            radiusX: centerX; radiusY: centerY
            x: toX; y: toY
        }
        PathLine { x: centerX; y: centerY }
    }
    TapHandler {
        id: tapHandler
        onTapped: pizzaPiece.clicked()
    }
}

您可以Try it Online!

相关问题