Qml 中实现时间轴组件
【写在前面】
时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件。
本文将介绍如何使用 Qml 实现一个灵活且可定制的时间轴组件,并探讨其设计思路和实现细节。
【正文开始】
效果图

组件概述
我们实现的时间轴组件具有以下特点:
- 支持自定义节点样式:可以设置节点的图标、背景颜色、边框颜色等。
- 支持自定义线条样式:可以设置线条的颜色和宽度。
- 支持自定义时间显示格式:可以设置时间的显示格式和字体样式。
- 支持自定义内容样式:可以设置内容的背景颜色、边框颜色、字体样式等。
- 支持正序和倒序排列:可以根据时间戳对事件进行正序或倒序排列。
实现细节
1. 组件结构
时间轴组件的核心是一个 ListView,它用于展示所有的事件项。每个事件项由三个部分组成:
- 节点:表示事件的时间点,可以是图标或圆形背景。
- 线条:连接相邻事件的节点。
- 内容:显示事件的具体内容和时间。
2. 属性定义
组件提供了多个属性来定制时间轴的外观和行为:
- 节点样式:
defaultNodeIconColor、defaultNodeBackgroundRadius、defaultNodeBackgroundColor、defaultNodeBorderColor、defaultNodeBorderWidth。 - 线条样式:
defaultLineColor、defaultLineWidth。 - 时间样式:
defaultTimeFont、defaultTimeFontColor、defaultTimeFormat。 - 内容样式:
defaultContentFormat、defaultContentFont、defaultContentFontColor、defaultContentBackgroundRadius、defaultContentBackgroundColor、defaultContentBorderColor、defaultContentBorderWidth。
3. 数据模型
时间轴组件使用 ListModel 来存储事件数据。每个事件项包含以下属性:
timestamp:事件的时间戳。content:事件的内容。nodeOptions:节点的样式选项。lineOptions:线条的样式选项。timeOptions:时间的样式选项。contentOptions:内容的样式选项。
4. 事件项的添加和排序
组件提供了 append 函数来添加新的事件项,并根据时间戳进行排序。sort 函数用于对现有的事件项进行重新排序。
function append(object) {
__initOptions(object);
let index = 0;
let rowCount = listModel.count;
for (let i = 0; i < rowCount; i++) {
if (root.reverse) {
if (listModel.get(i).__timestamp < object.__timestamp) {
index = i + 1;
} else break;
} else {
if (listModel.get(i).__timestamp > object.__timestamp) {
index = i + 1;
} else break;
}
}
listModel.insert(index, object);
}
function sort() {
let rowCount = listModel.count;
for (let i = 0; i < rowCount; i++) {
for (let j = 0; i + j < rowCount - 1; j++) {
if (root.reverse) {
if (listModel.get(j).__timestamp > listModel.get(j + 1).__timestamp) {
listModel.move(j, j + 1, 1);
}
} else {
if (listModel.get(j).__timestamp < listModel.get(j + 1).__timestamp) {
listModel.move(j, j + 1, 1);
}
}
}
}
}
5. 事件项的渲染
每个事件项通过 Loader 动态加载节点、线条和内容组合组件:
Loader {
id: lineLoader
active: index !== (listModel.count - 1)
width: nodeLoader.width
height: parent.height - nodeLoader.height
anchors.top: nodeLoader.bottom
sourceComponent: lineDelegate
property var lineOptions: __lineOptions
}
Loader {
id: nodeLoader
sourceComponent: nodeDelegate
property var nodeOptions: __nodeOptions
}
Loader {
id: contentLoader
anchors.left: nodeLoader.right
anchors.leftMargin: 10
anchors.right: parent.right
sourceComponent: contentDelegate
property var content: __content
property var contentOptions: __contentOptions
property var timestamp: __timestamp
property var timeOptions: __timeOptions
}
如何使用
我们可以像使用标准的 qml 元素一样使用时间轴组件:
import QtQuick 2.15
import QtQuick.Controls 2.15
ApplicationWindow {
visible: true
width: 800
height: 600
title: "Timeline Example"
Timeline {
id: timeline
width: 400
anchors.top: row.bottom
anchors.topMargin: 10
anchors.bottom: parent.bottom
anchors.horizontalCenter: parent.horizontalCenter
defaultNodeBackgroundColor: "transparent"
defaultNodeBorderWidth: 1
defaultTimeFormat: "yyyy-MM-dd hh:mm:ss"
initModel: [
{
timestamp: new Date(2024, 7, 1, 1),
content: "更新 Github 模板 1",
nodeOptions: { icon: "\uf27b" }
},
{
timestamp: new Date(2024, 7, 7, 11),
content: "更新 Github 模板 2",
nodeOptions: { backgroundColor: "blue" },
lineOptions: { color: "red" }
},
{
timestamp: new Date(2024, 7, 7, 16),
content: "更新 Github 模板 2",
lineOptions: { width: 5 }
},
{
timestamp: new Date(2024, 7, 9, 5, 30),
content: "更新 Github 模板 3"
},
{
timestamp: new Date(2024, 7, 12, 9),
timeOptions: {
font: { family: "华文彩云", pointSize: 12 },
fontColor: "green",
format: "yyyy-MM-dd hh:mm:ss:zzz"
},
content: "更新 Github 模板 4",
},
{
timestamp: new Date(2024, 7, 12, 18, 30),
content: "更新 Github 模板 5",
contentOptions: {
font: { family: "微软雅黑", pointSize: 14 },
fontColor: "red",
backgroundColor: "#ddd"
}
},
{
timestamp: new Date(2024, 7, 17, 5, 35),
content: "更新 Github 模板 6 ===================================",
contentOptions: {
borderColor: "#ddd"
}
}
]
}
}
【结语】
通过自定义 Qml 组件,我们实现了一个灵活且可定制的时间轴组件。
该组件不仅支持基本的时间轴功能,还提供了丰富的样式定制选项,能够满足各种实际开发需求。
最后:项目链接(多多star呀.._):
Github: https://github.com/mengps/QmlControls
Gitee: https://gitee.com/MenPenS/QmlControls
Qml 中实现时间轴组件的更多相关文章
- winform中的时间轴控件
我现在做的项目遇到一个需求,就是有没有类似的控件: 我要实现的功能是:播放录像. 某个时间段内假如有2个录像,这个坐标表示的是时间,假如我现在拖动时间轴,拖到第一个录像里面开始播放第一个录像,拖到2个 ...
- 微信小程序 - 时间轴(组件)
更新日期: 2019/3/6:首次发布 2019/3/7:增加content和date自定义(具体使用看示例) 时间轴 参数: 1. data(新闻列表数据)- 2019/3/6 2. content ...
- 看看我做的一款 时间轴 插件 timegliderJs
TimegliderJs 是一款基于jQuery的时间轴插件.完成后效果. 介绍 Timeglider JS是一个由javascript支持缩放,数据驱动的时间轴组件.非常适合显示项目历史,项目计划及 ...
- Android 时间轴的实现
时间轴 时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户带来一种更加直观的体验.京东和淘宝的物流顺序就是一个时间轴(如图),想必大家都不陌生. 时间轴的初探 初次见到这种UI,感觉整个布局 ...
- 第二百一十八节,jQuery EasyUI,TimeSpinner(时间微调)组件
jQuery EasyUI,TimeSpinner(时间微调)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 TimeSpinner(时间微 ...
- element ui step组件在另一侧加时间轴显示
这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...
- jsfl 将库中声音放置到时间轴上
setBrokenFrames("cz1.mp3",2); /**/ /*<--------------将库中声音放置到时间轴上------------->*/ /** ...
- SharePoint 中时间轴 Timeline的实现
客户需要在OA中实现每日动态功能,能够记录每一位员工的每天的工作动态,我很快想到了时间轴,因为时间轴能很直观的现实员工每一刻的动态.就像Facebook的Timeline效果(点击查看). 尝试着搜索 ...
- Android时间轴效果,直接使用在你的项目中
近期开发app搞到历史查询,受腾讯qq的启示,搞一个具有时间轴效果的ui,看上去还能够,然后立即想到分享给小伙伴,,大家一起来看看,先上效果图吧 watermark/2/text/aHR0cDovL2 ...
- highcharts中的x轴如何显示时分秒时间格式
上一篇文章写道:三分钟上手Highcharts简易甘特图:https://www.jianshu.com/p/d669d451711b,在官方文档里面,x轴默认为年月日. 在项目需求中,x轴要表示24 ...
随机推荐
- C++学习——类当中static关键字的作用
一.类和对象 我们知道类是"行为"和"属性"的集合,我们可以通过类来实例化对象,从而定义对象的"行为"和"属性".比如: ...
- 6. jenkins触发器
常用的触发器 Jenkins内置4种构建触发器 触发远程 构建其他工程构建后触发(Build after other projects are build) 定时构建(Build periodical ...
- AlignSum:数据金字塔与层级微调,提升文本摘要模型性能 | EMNLP'24
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: AlignSum: Data Pyramid Hierarchical Fine-tuning for Aligning with Human ...
- ExtJS & Asp.NET
企业应用中,要快速开发Web应用,前端使用ExtJS还行,包含许多常用的控件,图标,配色方案... 帖上部分载图: 完全可订制的登录界面: 可调整的布局: 可综合使用的模态对话框: 树结构及动态加载: ...
- CF2027D The Endspeaker (Hard Version) 题解
题面 给你一个长度为 \(n\) 的数组 \(a\) 和一个长度为 \(m\) 的数组 \(b\) (所有 \(1 \le i < m\) 满足 \(b_i > b_{i+1}\) ).最 ...
- 域渗透之初识LM&NTLM认证过程
目录 前言 LM Hash NTLM Hash Windows本地认证 LSASS进程 Mimikatz抓取明文密码 Windows网络认证 Net NTLM NTLMv1 & NTLMv2 ...
- antlr的使用
我从以下几个问题入手介绍ANTLR的相关知识. 1 ANTLR是什么? ANTLR, ANother Tool for Language Recognition, 是一个可以接受含有语法描述的语言描述 ...
- golang类型转换模块之gconv
gf框架提供了非常强大的类型转换包gconv,可以实现将任何数据类型转换为指定的数据类型,对常用基本数据类型之间的无缝转换,同时也支持任意类型到struct对象的属性赋值.由于gconv模块内部大量使 ...
- Golang之学习资源参考
使用golang开发也有一段时间,在此总结一些自己从0入门到掌握所涉及一些资源,希望可以帮助其他人 [初级] 基础语法练习: https://gobyexample.com/ [中级] 1.gola ...
- Goland破解之无限重置(最新)
分享一下 JetBrains 全家桶 IDEA 2021.x 的激活破解教程,相当于永久激活 破解了,亲测有效,下面是详细文档哦~ JetBrains 全家桶 IDEA 2021.x 破解激活教程,相 ...