QML自定义组件(时钟)

新闻资讯   2023-07-12 12:04   71   0  
在 QML 开发过程中,经常需要自定义组件,这有利于我们的代码复用性、模块化、以及扩展性。通过使用自定义组件,不但可以提高开发效率,降低维护成本,还可以快速构建出功能丰富、灵活可扩展的 QML 应用程序。
今天要给大家分享的是一个 Clock 组件,通过这个组件,可以实现各种大小、样式风格的时钟。
下面,让我们来欣赏一下效果图。
左侧是默认样式,右侧可以通过鼠标点击随机变换样式。

逻辑控制

为了实现 Clock 组件,我们先进行一些职责划分,将显示部分放在独立的 QML 文件中完成,逻辑控制部分放在 JS 文件中完成。
要绘制时钟,按照步骤拆分,需要有背景、数字、时针等,以下是 clock.js 中的部分代码:
  1. this.draw = function(ctx) {

  2. ctx.clearRect(0, 0, 300, 300)

  3. ctx.save()

  4. var time = newDate()

  5. var hours = time.getHours()

  6. var minutes = time.getMinutes()

  7. var seconds = time.getSeconds()

  8. // 1. 绘制背景

  9. this.drawBackground(ctx)

  10. // 2. 绘制的数字

  11. this.drawNumbers(ctx)

  12. // 3. 绘制时针

  13. this.drawHour(ctx, hours, minutes, seconds)

  14. // 4. 绘制分针

  15. this.drawMinute(ctx, minutes, seconds)

  16. // 5. 绘制秒针

  17. this.drawSecond(ctx, seconds)

  18. // 6. 绘制圆心

  19. this.drawCircle(ctx)

  20. // 7. 绘制时针的刻度

  21. this.drawHourTick(ctx)

  22. // 8. 绘制分针的刻度

  23. this.drawMinuteTick(ctx)

  24. ctx.restore()

  25. }

组件封装

具体的组件,则放在 Clock.qml 文件中。为了便于控制样式,它对外提供了一系列属性,例如 backgroundColor、circleColor 等。
  1. importQtQuick

  2. import"qrc:/js/clock.js" as JsClock

  3. Item{

  4. property color backgroundColor: "white"

  5. property color circleColor: "gray"

  6. property color circleBorderColor: "black"

  7. property color borderColor: "black"

  8. property int borderWidth: 2

  9. property color numberColor: "black"

  10. property color hourColor: "black"

  11. property color minuteColor: "black"

  12. property color secondColor: "orange"

  13. property color hourTickColor: "black"

  14. property color minuteTickColor: "black"

  15. Canvas{

  16. id: clockCanvas

  17. anchors.fill: parent

  18. property var clock: newJsClock.Clock()

  19. onPaint: {

  20. draw()

  21. }

  22. // 绘制钟表

  23. function draw() {

  24. var ctx = getContext("2d")

  25. ctx.save()

  26. var scaleX = width / 300

  27. var scaleY = height / 300

  28. ctx.scale(scaleX, scaleY)

  29. setStyle()

  30. clock.draw(ctx)

  31. ctx.restore()

  32. requestAnimationFrame(draw)

  33. }

  34. // 设置样式

  35. function setStyle() {

  36. clock.setBackgroundColor(backgroundColor)

  37. clock.setCircleColor(circleColor)

  38. clock.setCircleBorderColor(circleBorderColor)

  39. clock.setBorderColor(borderColor)

  40. clock.setBorderWidth(borderWidth)

  41. clock.setNumberColor(numberColor)

  42. clock.setHourColor(hourColor)

  43. clock.setMinuteColor(minuteColor)

  44. clock.setSecondColor(secondColor)

  45. clock.setHourTickColor(hourTickColor)

  46. clock.setMinuteTickColor(minuteTickColor)

  47. }

  48. }

  49. }

组件使用

组件有了之后,就可以像其他元素一样使用它了。我们分别实现两个钟表,一个是默认样式的,一个可以通过鼠标点击随机变色。
  1. importQtQuick

  2. importQtQuick.Layouts

  3. import"../component"

  4. Rectangle{

  5. id: clockPage

  6. // 取值范围 [min, max]

  7. function randomNumber(min, max) {

  8. returnMath.floor((Math.random() * (max - min + 1)) + min)

  9. }

  10. // 随机颜色

  11. function randomColor() {

  12. returnQt.rgba(randomNumber(0, 1), randomNumber(0, 1), randomNumber(0, 1), 1)

  13. }

  14. RowLayout{

  15. anchors.fill: parent

  16. spacing: 10

  17. Item{

  18. Layout.fillWidth: true

  19. }

  20. Clock{

  21. width: 300

  22. height: 300

  23. }

  24. Clock{

  25. id: randomClock

  26. width: 400

  27. height: 400

  28. function setRandomStyle() {

  29. randomClock.backgroundColor = randomColor()

  30. randomClock.circleColor = randomColor()

  31. randomClock.circleBorderColor = randomColor()

  32. randomClock.borderColor = randomColor()

  33. randomClock.borderWidth = randomNumber(5, 20)

  34. randomClock.numberColor = randomColor()

  35. randomClock.hourColor = randomColor()

  36. randomClock.minuteColor = randomColor()

  37. randomClock.secondColor = randomColor()

  38. randomClock.hourTickColor = randomColor()

  39. randomClock.minuteTickColor = randomColor()

  40. }

  41. MouseArea{

  42. anchors.fill: parent

  43. onClicked: randomClock.setRandomStyle()

  44. }

  45. Component.onCompleted: setRandomStyle()

  46. }

  47. Item{

  48. Layout.fillWidth: true

  49. }

  50. }

  51. }


END

来源:高效程序员

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
被一个gpio口搞死的一天
为什么Keil比IAR更受欢迎?
分享几个不错的嵌入式开源项目

→点关注,不迷路←

文章引用微信公众号"嵌入式微处理器",如有侵权,请联系管理员删除!

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。