当前位置: 首页 > news >正文

Qml 实现星级评分组件

【写在前面】

        在现代应用程序中,星级评分是一个常见的用户界面元素,它允许用户对产品、服务或内容进行评价。

        想必大家在用各种带有评分的软件中看到过这个组件:

         本文将指导你如何使用 Qml 创建一个简单而美观的星级评分组件,并且支持高度自定义。


 【正文开始】

        先来看看效果图:

         现在开始讲解思路:

        首先,我们需要考虑半星的情况,因此可以分为三个部分:

        1、红色部分:满填充星星fillDelegate】。

        2、绿色部分:半填充星星halfDelegate】​​​​​​​。

        2、蓝色部分:无填充星星emptyDelegate】​​​​​​​。

        这三部分都是通过代理实现的,因此如果需要自定义,则必须提供这三个组件:

    property Component fillDelegate: Component {Text {text: fillIconcolor: root.iconColorfont.family: fontAwesome.namefont.pixelSize: iconFontSize}}property Component emptyDelegate: Component {Text {text: emptyIconcolor: root.iconColorfont.family: fontAwesome.namefont.pixelSize: iconFontSize}}property Component halfDelegate: Component {Text {text: halfIconcolor: root.iconColorfont.family: fontAwesome.namefont.pixelSize: iconFontSize}}

         接下来,我们需要计算每个部分的数量,其中半星必然只有一颗( 如果有 ):

    property int fillCount: Math.floor(root.value)property int emptyStartIndex: Math.round(root.value)property bool hasHalf: root.value - fillCount > 0

         然后用 Repeater Loader 载入即可:

    Repeater {id: repeatermodel: root.countdelegate: MouseArea {id: rootItemwidth: root.iconSizeheight: root.iconSizehoverEnabled: trueonEntered: hovered = true;onExited: hovered = false;onClicked: {root.isDone = !root.isDone;if (root.isDone) {__private.doneValue = root.value;root.done(__private.doneValue);}}onPositionChanged: function(mouse) {if (root.allowHalf) {if (mouse.x > (width * 0.5)) {root.value = index + 1;} else {root.value = index + 0.5;}} else {root.value = index + 1;}}property bool hovered: falseLoader {active: index < repeater.fillCountsourceComponent: fillDelegateproperty bool hovered: rootItem.hovered}Loader {active: repeater.hasHalf && index === (repeater.emptyStartIndex - 1)sourceComponent: halfDelegateproperty bool hovered: rootItem.hovered}Loader {active: index >= repeater.emptyStartIndexsourceComponent: emptyDelegateproperty bool hovered: rootItem.hovered}}property int fillCount: Math.floor(root.value)property int emptyStartIndex: Math.round(root.value)property bool hasHalf: root.value - fillCount > 0}

        至此,核心部分讲解完了,其他部分直接看源码即可。 


【结语】

        最后:项目链接(多多star呀..⭐_⭐):

        Github 地址:https://github.com/mengps/QmlControls/tree/master/Rateicon-default.png?t=O83Ahttps://github.com/mengps/QmlControls/tree/master/Rate        CSDN 的:
https://download.csdn.net/download/u011283226/89734737icon-default.png?t=O83Ahttps://download.csdn.net/download/u011283226/89734737

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MyBatis 入门之动态 SQL
  • ElasticSearch的DSL查询④(DSL查询、RestClient的DSL查询)
  • Windows安装HeidiSQL教程(图文)
  • 在 SNMP 中的数据类型码
  • 机器学习 第10章 降维与度量学习
  • 真实案例分享:零售企业如何避免销售数据的无效分析?
  • Kali Linux 设置与维护教程
  • 【开源大模型生态7】华为的盘古大模型
  • 《三角洲行动》“是时候玩点好的” 9月26日在PC及移动端上线
  • vscode 高效率开发手册
  • 一分钟了解统一软件开发过程RUP的那点事
  • 说说相机标定?
  • react-问卷星项目(1)
  • 【JAVA基础】实现Tomcat基本功能
  • 2024年【起重信号司索工(建筑特殊工种)】考试题及起重信号司索工(建筑特殊工种)免费试题
  • [PHP内核探索]PHP中的哈希表
  • Apache Pulsar 2.1 重磅发布
  • CSS相对定位
  • Date型的使用
  • extjs4学习之配置
  • Git同步原始仓库到Fork仓库中
  • java第三方包学习之lombok
  • SwizzleMethod 黑魔法
  • Vue 2.3、2.4 知识点小结
  • Vue.js-Day01
  • 爱情 北京女病人
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 基于Android乐音识别(2)
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 深度学习在携程攻略社区的应用
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 一些css基础学习笔记
  • 怎么将电脑中的声音录制成WAV格式
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #565. 查找之大编号
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #define用法
  • #Linux(帮助手册)
  • (1)(1.13) SiK无线电高级配置(六)
  • (vue)页面文件上传获取:action地址
  • (分布式缓存)Redis哨兵
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (实战篇)如何缓存数据
  • (四)进入MySQL 【事务】
  • (转)大型网站架构演变和知识体系
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...