pyside6 qml 支持更新液位的伪 3D 圆柱
作者:Mr_No爱学习
- 2022-11-05 美国
本文字数:1639 字
阅读完需:约 5 分钟
利用 Shape 来绘制,以前基于 Canvas 实现过类似的控件,但是 Canvas 要 requestPaint 触发液面的更新,而且有重影,性能也不如 Shapes。
思路就是绘制两层圆柱
外面的一层是瓶身
里面的一层是液体
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Shapes 1.6
Shape {
id: root
property color color: "#A0333666"
property int percentage: 100
width: 52
height: 58
//多重采样抗锯齿
layer.enabled: true
layer.samples: 8
//平滑处理
smooth: true
//默认抗锯齿
antialiasing: true
ShapePath {
fillColor: color
startX: 0
startY: root.width/8
fillRule: ShapePath.WindingFill
PathLine {
x: 0
y: root.height - root.width/8
}
PathCubic {
x: root.width; y: root.height - root.width/8
relativeControl1X: root.width/10; relativeControl1Y: root.height/10
relativeControl2X: 9*root.width/10; relativeControl2Y: root.height/10
}
PathLine {
x: root.width
y: root.width/8
}
PathCubic {
x: 0; y: root.width/8
relativeControl1X: -root.width/10; relativeControl1Y: -root.height/10
relativeControl2X: -9*root.width/10; relativeControl2Y: -root.height/10
}
}
ShapePath {
fillColor: "#00FA9A"
startX: 0
startY: root.width/8 + (root.height - root.width/4)*(1 - percentage/100)
fillRule: ShapePath.WindingFill
PathLine {
x: 0
y: root.height - root.width/8
}
PathCubic {
x: root.width; y: root.height - root.width/8
relativeControl1X: root.width/10; relativeControl1Y: root.height/10
relativeControl2X: 9*root.width/10; relativeControl2Y: root.height/10
}
PathLine {
x: root.width
y: root.width/8 + (root.height - root.width/4)*(1 - percentage/100)
}
PathCubic {
x: 0; y: root.width/8 + (root.height - root.width/4)*(1 - percentage/100)
relativeControl1X: -root.width/10; relativeControl1Y: root.height/10
relativeControl2X: -9*root.width/10; relativeControl2Y: root.height/10
}
PathCubic {
x: root.width; y: root.width/8 + (root.height - root.width/4)*(1 - percentage/100)
relativeControl1X: root.width/10; relativeControl1Y: -root.height/10
relativeControl2X: 9*root.width/10; relativeControl2Y: -root.height/10
}
PathCubic {
x: 0; y: root.width/8 + (root.height - root.width/4)*(1 - percentage/100)
relativeControl1X: -root.width/10; relativeControl1Y: root.height/10
relativeControl2X: -9*root.width/10; relativeControl2Y: root.height/10
}
}
Text {
text: percentage.toString() + "%"
anchors {
centerIn: parent
}
}
Timer {
id: countDownTimer
interval: 100
running: true
repeat: true
onTriggered: {
percentage -= 1;
if (percentage <= 0) {
countDownTimer.stop();
}
}
}
}
复制代码
实现效果
液量更新效果,可能是录制 gif 帧率的关系,看起来有重影,实际运行是没有的
划线
评论
复制
发布于: 刚刚阅读数: 4
Mr_No爱学习
关注
还未添加个人签名 2019-09-13 加入
还未添加个人简介
评论