【写在前面】

时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件。

本文将介绍如何使用 Qml 实现一个灵活且可定制的时间轴组件,并探讨其设计思路和实现细节。


【正文开始】

效果图

组件概述

我们实现的时间轴组件具有以下特点:

  1. 支持自定义节点样式:可以设置节点的图标、背景颜色、边框颜色等。
  2. 支持自定义线条样式:可以设置线条的颜色和宽度。
  3. 支持自定义时间显示格式:可以设置时间的显示格式和字体样式。
  4. 支持自定义内容样式:可以设置内容的背景颜色、边框颜色、字体样式等。
  5. 支持正序和倒序排列:可以根据时间戳对事件进行正序或倒序排列。

实现细节

1. 组件结构

时间轴组件的核心是一个 ListView,它用于展示所有的事件项。每个事件项由三个部分组成:

  • 节点:表示事件的时间点,可以是图标或圆形背景。
  • 线条:连接相邻事件的节点。
  • 内容:显示事件的具体内容和时间。
2. 属性定义

组件提供了多个属性来定制时间轴的外观和行为:

  • 节点样式defaultNodeIconColordefaultNodeBackgroundRadiusdefaultNodeBackgroundColordefaultNodeBorderColordefaultNodeBorderWidth
  • 线条样式defaultLineColordefaultLineWidth
  • 时间样式defaultTimeFontdefaultTimeFontColordefaultTimeFormat
  • 内容样式defaultContentFormatdefaultContentFontdefaultContentFontColordefaultContentBackgroundRadiusdefaultContentBackgroundColordefaultContentBorderColordefaultContentBorderWidth
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 中实现时间轴组件的更多相关文章

  1. winform中的时间轴控件

    我现在做的项目遇到一个需求,就是有没有类似的控件: 我要实现的功能是:播放录像. 某个时间段内假如有2个录像,这个坐标表示的是时间,假如我现在拖动时间轴,拖到第一个录像里面开始播放第一个录像,拖到2个 ...

  2. 微信小程序 - 时间轴(组件)

    更新日期: 2019/3/6:首次发布 2019/3/7:增加content和date自定义(具体使用看示例) 时间轴 参数: 1. data(新闻列表数据)- 2019/3/6 2. content ...

  3. 看看我做的一款 时间轴 插件 timegliderJs

    TimegliderJs 是一款基于jQuery的时间轴插件.完成后效果. 介绍 Timeglider JS是一个由javascript支持缩放,数据驱动的时间轴组件.非常适合显示项目历史,项目计划及 ...

  4. Android 时间轴的实现

    时间轴 时间轴,顾名思义就是将发生的事件按照时间顺序罗列起来,给用户带来一种更加直观的体验.京东和淘宝的物流顺序就是一个时间轴(如图),想必大家都不陌生. 时间轴的初探 初次见到这种UI,感觉整个布局 ...

  5. 第二百一十八节,jQuery EasyUI,TimeSpinner(时间微调)组件

    jQuery EasyUI,TimeSpinner(时间微调)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 TimeSpinner(时间微 ...

  6. element ui step组件在另一侧加时间轴显示

    这是我开发的时候遇到的一个问题:项目需要在步骤条(竖直方向)的另一侧加时间显示,但是我在element ui 的step组件中一直没找着设置方法,所以就自己想了个办法加进来,效果如下: 代码如下,先上 ...

  7. jsfl 将库中声音放置到时间轴上

    setBrokenFrames("cz1.mp3",2); /**/ /*<--------------将库中声音放置到时间轴上------------->*/ /** ...

  8. SharePoint 中时间轴 Timeline的实现

    客户需要在OA中实现每日动态功能,能够记录每一位员工的每天的工作动态,我很快想到了时间轴,因为时间轴能很直观的现实员工每一刻的动态.就像Facebook的Timeline效果(点击查看). 尝试着搜索 ...

  9. Android时间轴效果,直接使用在你的项目中

    近期开发app搞到历史查询,受腾讯qq的启示,搞一个具有时间轴效果的ui,看上去还能够,然后立即想到分享给小伙伴,,大家一起来看看,先上效果图吧 watermark/2/text/aHR0cDovL2 ...

  10. highcharts中的x轴如何显示时分秒时间格式

    上一篇文章写道:三分钟上手Highcharts简易甘特图:https://www.jianshu.com/p/d669d451711b,在官方文档里面,x轴默认为年月日. 在项目需求中,x轴要表示24 ...

随机推荐

  1. python报错:If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0

    相关: https://stackoverflow.com/questions/72441758/typeerror-descriptors-cannot-not-be-created-directl ...

  2. 5.2 Vi和Vim之间到底有什么关系?

    我们知道,Vi 编辑器是 Unix 系统最初的编辑器.它使用控制台图形模式来模拟文本编辑窗口,允许查看文件中的行.在文件中移动.插入.编辑和替换文本. 尽管 Vi 可能是世界上复杂的编辑器(讨厌它的人 ...

  3. 3.16 Linux删除文件或目录(rm命令)

    当 Linux 系统使用很长时间之后,可能会有一些已经没用的文件(即垃圾),这些文件不但会消耗宝贵的硬盘资源,还是降低系统的运行效率,因此需要及时地清理. rm 是强大的删除命令,它可以永久性地删除文 ...

  4. VL4AD:让语义分割认识未知类别,无需额外数据和训练的OOD语义分割 | ECCV'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: VL4AD: Vision-Language Models Improve Pixel-wise Anomaly Detection 论文地址 ...

  5. Vulhub WebLogic漏洞复现

    目录 前言 任意文件上传漏洞(CVE-2018-2894) 管理控制台未授权RCE漏洞(CVE-2020-14882 & CVE-2020-14883) 未授权RCE漏洞(CVE-2023-2 ...

  6. 使用缓存构建更快的 Web 应用程序

    使用 Java 缓存系统缓存频繁查看的数据 使用 Java 技术的 Web 开发人员可以使用缓存实用程序快速提升他们的应用程序的性能.Java 缓存系统(Java Caching System,JCS ...

  7. laravel之验证器

    开发中使用框架自带验证器进行参数验证 1.定义验证器基类,定义失败返回值 新建基础类文件 app > Http > Requests > BaseRequest.php <?p ...

  8. 【docker-compose】Redis安装教程

    仅供学习参考 ,请勿轻易在生产环境使用 0. 文件目录 下面的文件按照这个目录层级放置,首先创建 /docker/redis 文件夹,/docker/redis 对应下边图中 REDIS. 1. 创建 ...

  9. 一个.NET开源、免费、功能强大的 PDF 处理工具

    前言 在日常工作中PDF文档的处理往往受限于其固有的格式,使得用户在编辑.合并.剪裁等方面面临诸多不便.今天大姚给大家分享一个.NET开源.免费.功能强大的 PDF 处理工具:PDF 补丁丁(PDFP ...

  10. 利用 Databend + COS助力 CDH 分析 | 某医药集团

    作者: 黄志武 某医药集团信息中心数据库组组长,13 年数据库行业从业经历,Oracle OCM,关注 Oracle.MySQL.Redis.MongoDB.Oceanbase.Tidb.Polard ...