我对QML还很陌生,我想做一个基本的应用程序,它由一个20-30段的分段圆(比萨饼片)和一个计数器组成。计数器上的数字是被突出显示的段的数量。我在其他问题中找到了一些制作分段圆的方法,但不幸的是,它们似乎都不适合我的任务。我认为现在唯一的方法是在每次计数器改变时重新绘制所有的段,并改变所需段的颜色。那么有没有一个最佳的方法来实现这一点呢?
col17t5w1#
为了降低复杂性,让我们来解决这个问题的简化版本:
下面是数学:
要渲染作品,图纸将:
我们要在点2和点3之间绘制一条曲线,而不是直线。为了渲染这个,我们可以使用Shape、ShapePath、PathLine和PathArc。为了推广,我们可以用20来代替6,并相应地推广所有公式。
Shape
ShapePath
PathLine
PathArc
Repeater { model: 20 PizzaPiece { piece: index } }
为了润色它,我添加了一个Slider,这样你就可以交互式地在0-20之间更改你想要的片数,并将颜色设置为"orange",否则它将是浅黄色"#ffe"。
Slider
"orange"
"#ffe"
Repeater { model: 20 PizzaPiece { piece: index fillColor: index < slider.value ? "orange" : "#ffe" } } Slider { id: slider from: 0 to: 20 stepSize: 1 }
作为额外的奖励,我添加了一个TapHandler,这样每一块都是可点击的。如果你让鼠标按下,这块将显示“红色”,直到你释放鼠标。
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!
1条答案
按热度按时间col17t5w1#
为了降低复杂性,让我们来解决这个问题的简化版本:
下面是数学:
要渲染作品,图纸将:
我们要在点2和点3之间绘制一条曲线,而不是直线。
为了渲染这个,我们可以使用
Shape
、ShapePath
、PathLine
和PathArc
。为了推广,我们可以用20来代替6,并相应地推广所有公式。
为了润色它,我添加了一个
Slider
,这样你就可以交互式地在0-20之间更改你想要的片数,并将颜色设置为"orange"
,否则它将是浅黄色"#ffe"
。作为额外的奖励,我添加了一个
TapHandler
,这样每一块都是可点击的。如果你让鼠标按下,这块将显示“红色”,直到你释放鼠标。您可以Try it Online!