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 ...
随机推荐
- 牛客多校H题题解
链接:[https://ac.nowcoder.com/acm/contest/81597/H] 来源:牛客网 题目描述 Red stands at the coordinate \((0,0)\) ...
- 服务器cli模式下的定时器
有时候需要一部分后台业务异步的处理,比如处理redis队列啊,处理mysql统计啊,数据同步啊,这种长时间任务,但是又需要每段时间去看看的,发现linux cron最小只能支持每分钟的任务 分 时 天 ...
- 运维工具之saltstack
参考:https://www.cnblogs.com/xintiao-/p/10380656.html saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现 ...
- CF926 Div.2
C. Sasha and the Casino 赌场规则:如果下注 \(y(y > 0)\) 元,如果赢了则除了 \(y\) 元外,额外获得 \(y \times (k - 1)\) 元,否则则 ...
- AtCoder Beginner Contest 379
Contest Link C 妙妙贪心题,居然需要高斯求和公式. Submission D 妙妙套路题,维护全局 lazytag,easy to solve. Submission E 妙妙拆贡献题, ...
- R数据分析:临床预测模型实操,校准曲线和DCA曲线做法示例
之前给大家写过好几篇很详细的临床预测模型的原理解析,本文接着之前的文章,继续写做法,首先依然是找到一篇参照论文,今天我们的示例文章是一篇来自美国心脏学会杂志的文章: Zhang X, Yuan K, ...
- Flutter自动生成安卓和IOS图标
flutter_launcher_icons 用这个库自动生成 首先添加依赖 dev_dependencies: flutter_launcher_icons: flutter_icons: andr ...
- 探索使用 ViewContainerRef 的 Angular DOM 操控技术
探索使用 ViewContainerRef 的 Angular DOM 操控技术 https://indepth.dev/posts/1052/exploring-angular-dom-manipu ...
- Kubernetes 可能是分布式架构的大结局了
前两年在爬虫里折腾的太久了,最近快马加鞭追赶分布式架构潮流. SpringCloud.Dubbo.ServiceComb 刷完,以为分布式架构就是这样了.这批架构可能也就 Java 栈的人会感觉它们特 ...
- docker save与docker export实现docker镜像与容器的备份
本来想写一篇关于docker save/export/commit/load/import之间的关系的文章,后来看了看,已经有很多人写过了,我就不做重复工作了. 参见: docker save与doc ...