Qml 实现星级评分组件 已发布

打印 上一主题 下一主题

主题 511|帖子 511|积分 1535

【写在前面】

在当代应用程序中,星级评分是一个常见的用户界面元素,它允许用户对产品、服务或内容进行评价。
想必大家在用各种带有评分的软件中看到过这个组件:

本文将引导你怎样使用 Qml 创建一个简单而美观的星级评分组件,并且支持高度自定义。
【正文开始】

先来看看结果图:

如今开始解说思路:
首先,我们需要考虑半星的情况,因此可以分为三个部门:

1、赤色部门:满填充星星【fillDelegate】。
2、绿色部门:半填充星星【halfDelegate】。
3、蓝色部门:无填充星星【emptyDelegate】。
这三部门都是通过署理实现的,因此假如需要自定义,则必须提供这三个组件:
  1.     property Component fillDelegate: Component {
  2.         Text {
  3.             text: fillIcon
  4.             color: root.iconColor
  5.             font.family: fontAwesome.name
  6.             font.pixelSize: iconFontSize
  7.         }
  8.     }
  9.     property Component emptyDelegate: Component {
  10.         Text {
  11.             text: emptyIcon
  12.             color: root.iconColor
  13.             font.family: fontAwesome.name
  14.             font.pixelSize: iconFontSize
  15.         }
  16.     }
  17.     property Component halfDelegate: Component {
  18.         Text {
  19.             text: halfIcon
  20.             color: root.iconColor
  21.             font.family: fontAwesome.name
  22.             font.pixelSize: iconFontSize
  23.         }
  24.     }
复制代码
接下来,我们需要计算每个部门的数量,其中半星必然只有一颗( 假如有 ):
  1.     property int fillCount: Math.floor(root.value)
  2.     property int emptyStartIndex: Math.round(root.value)
  3.     property bool hasHalf: root.value - fillCount > 0
复制代码
然后用 Repeater + Loader 载入即可:
  1.     Repeater {
  2.         id: repeater
  3.         model: root.count
  4.         delegate: MouseArea {
  5.             id: rootItem
  6.             width: root.iconSize
  7.             height: root.iconSize
  8.             hoverEnabled: true
  9.             onEntered: hovered = true;
  10.             onExited: hovered = false;
  11.             onClicked: {
  12.                 root.isDone = !root.isDone;
  13.                 if (root.isDone) {
  14.                     __private.doneValue = root.value;
  15.                     root.done(__private.doneValue);
  16.                 }
  17.             }
  18.             onPositionChanged: function(mouse) {
  19.                 if (root.allowHalf) {
  20.                     if (mouse.x > (width * 0.5)) {
  21.                         root.value = index + 1;
  22.                     } else {
  23.                         root.value = index + 0.5;
  24.                     }
  25.                 } else {
  26.                     root.value = index + 1;
  27.                 }
  28.             }
  29.             property bool hovered: false
  30.             Loader {
  31.                 active: index < repeater.fillCount
  32.                 sourceComponent: fillDelegate
  33.                 property bool hovered: rootItem.hovered
  34.             }
  35.             Loader {
  36.                 active: repeater.hasHalf && index === (repeater.emptyStartIndex - 1)
  37.                 sourceComponent: halfDelegate
  38.                 property bool hovered: rootItem.hovered
  39.             }
  40.             Loader {
  41.                 active: index >= repeater.emptyStartIndex
  42.                 sourceComponent: emptyDelegate
  43.                 property bool hovered: rootItem.hovered
  44.             }
  45.         }
  46.         property int fillCount: Math.floor(root.value)
  47.         property int emptyStartIndex: Math.round(root.value)
  48.         property bool hasHalf: root.value - fillCount > 0
  49.     }
复制代码
至此,核心部门解说完了,其他部门直接看源码即可。
【结语】

末了:项目链接(多多star呀..⭐_⭐):
Github 地点:https://github.com/mengps/QmlControls/tree/master/Rate

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表