AWTK 表格视图的实现原理和用法

ops/2024/9/18 12:50:38/ 标签: AWTK, 串口屏

表格视图的基本用法

1. 基本概念

在这里插入图片描述

  • table_view_t 是表格视图的外壳,它的主要功能是协调 table_client_t 和滚动条。

  • table_header_t 是表格的标题,它其实只是一个普通的容器,完全可以用 view 代替,但用 table_header_t 更具可读性。

  • table_client_t 是表格的数据区,它是一个 table_row_t 的容器。

  • table_row_t 表示表格中的一行,它只是个容器,里面可以文本、图片、编辑器、进度条、滑块和下拉框等各种控件。

在这里插入图片描述

table_view_t 的为了解决大量数据的问题,我们把数据分为三类:

  • 虚拟区域。代表全部数据,它是虚拟的,无需加入到内存中来。

  • 缓存区域。代表实际在内存中创建的部分,为了让滑动效果比较流畅,缓存区域是可视区域的 3 倍。

  • 可视区域。代表当前呈现在窗口上的部分。

在这里插入图片描述

当拖到滚动条改变可视区域时,如果可视区域超出缓存区域,则调用用户提供的回调函数,更新缓存区域的位置和数据。

2. 用法

2.1 编写 XML

table_view 由 table_header(可选)、table_client 和 scroll_bar 组成。

在 table_client 中,只需要写一个 table_row,这个 table_row 只是作为模版,由 table_client 根据需要创建。

示例:

  <table_view x="10" y="10" w="-20" h="-80"><table_header x="0"  y="0" w="-12" h="30" name="title" children_layout="default(r=1,c=0,s=5,m=5)"><label w="20%" text="Name" /><label w="20%" text="Color"/><label w="40%" text="Value" /><label w="20%" text="Action" /></table_header><table_client name="table_client" x="0"  y="30" w="-12" h="-30" row_height="40"><table_row children_layout="default(r=1,c=0,s=5,m=5)"><label name="name"  w="20%" h="100%" text="name" /><combo_box name="color" readonly="true" w="20%" h="80%" options="red;green;blue"/><slider name="value" w="40%" h="80%" /><button name="remove" w="20%" h="80%" text="Remove" /></table_row></table_client><scroll_bar_d name="vbar" x="right" y="0" w="12" h="100%" value="0"/></table_view>

2.1 编写准备数据的回调函数

table_client 不需要预先创建全部的 table_row,而是在需要时调用回调函数,去填充指定行的数据。以当前的行号和 table_row 对象为参数,实现者在回调函数中,加载当前行的数据,然后设置到 row 的子控件中。

/*** @method table_client_set_on_load_data* 设置 加载数据的回调函数。* @param {widget_t*} widget widget 对象。* @param {table_client_on_load_data_t} on_load_data 回调函数。* @param {void*} ctx 回调函数的上下文。 ** @return {ret_t} 返回 RET_OK 表示成功,否则表示失败。*/
ret_t table_client_set_on_load_data(widget_t* widget, table_client_on_load_data_t on_load_data,void* ctx);

示例:

static ret_t on_load_data(void* ctx, uint32_t index, widget_t* row) {char name[32];tk_snprintf(name, sizeof(name), "name:%u", index);widget_set_text_utf8(widget_lookup(row, "name", TRUE), name);widget_set_value(widget_lookup(row, "value", TRUE),index%100);widget_set_value(widget_lookup(row, "color", TRUE), 0);return RET_OK;
}...table_client_set_on_load_data(client, on_load_data, client);
...

在本回调函数中,还可以调整控件的大小,设置控件的 style。

2.2 编写注册事件的回调函数

有时候,我们不是简单的显示数据,还要对数据进行编辑。此时需要设置一个回调函数,这个回调函数在 table_row 创建完成后调用。


/*** @method table_client_set_on_create_row* 设置 创建行时的回调函数,在回调函数中可以注册控件的事件。* @param {widget_t*} widget widget 对象。* @param {table_client_on_create_row_t} on_create_row 回调函数,在回调函数加载数据。* @param {void*} ctx 回调函数的上下文。 ** @return {ret_t} 返回 RET_OK 表示成功,否则表示失败。*/
ret_t table_client_set_on_create_row(widget_t* widget, table_client_on_create_row_t on_create_row,void* ctx)

示例:

static table_row_t* table_row_of(widget_t* child) {widget_t* iter = child;while(iter != NULL && !tk_str_eq(widget_get_type(iter), WIDGET_TYPE_TABLE_ROW)) {iter = iter->parent;}return TABLE_ROW(iter);
}static ret_t on_value_changed(void* ctx, event_t* e) {table_row_t* row = table_row_of(WIDGET(e->target));log_debug("changed: %d value=%d\n", row->index, widget_get_value(WIDGET(e->target)));return RET_OK;
}static ret_t on_color_changed(void* ctx, event_t* e) {table_row_t* row = table_row_of(WIDGET(e->target));log_debug("changed: %d value=%s\n", row->index, combo_box_get_text(WIDGET(e->target)));return RET_OK;
}static ret_t on_remove_clicked(void* ctx, event_t* e) {table_row_t* row = table_row_of(WIDGET(e->target));log_debug("clicked: %d \n", row->index);return RET_OK;
}static ret_t on_create_row(void* ctx, uint32_t index, widget_t* row) {widget_child_on(row, "value", EVT_VALUE_CHANGED, on_value_changed, NULL);widget_child_on(row, "color", EVT_VALUE_CHANGED, on_color_changed, NULL);widget_child_on(row, "remove", EVT_CLICK, on_remove_clicked, NULL);return RET_OK;
}...table_client_set_on_create_row(client, on_create_row, client);

在控件的事件处理函数中,可以通过 table_row_of 获取 row 对象,然后通过 row 对象的 index 属性,获取当前的行号,然后将数据保存到当前的行(如数据库)。


http://www.ppmy.cn/ops/13232.html

相关文章

使用Spring进行文件的上传和下载

概览 使用Spring进行文件的上传和下载Spring上传文件接口设计dubbo接口设计上传文件流的RPC的接口设计 Spring文件下载接口设计dubbo接口设计下载文件流的RPC的接口设计 spring上传文件大小控制 使用Spring进行文件的上传和下载 本文主要介绍在Spring框架下面调用微服务的dubb…

什么是国内生产总值(GDP)

国内生产总值 , 是国际上通行的用于衡量一个国家&#xff08;或地区&#xff09;经济运行规模的宏观经济指标&#xff0c;其在政治、经济、外交、研究等领域具有广泛应用。 一、国内生产总值的基本概念 国内生产总值是指一个国家和地区所有常住单位在一定时期内生产活动的全部…

NAT的知识点和实现

1.NAT的作用&#xff1a; &#xff08;1&#xff09;、把内网私网IP转换公网IP&#xff1b; &#xff08;2&#xff09;、隐藏内网&#xff0c;起到保护内网作用&#xff1b; &#xff08;3&#xff09;、适当的缓解的IPv4地址空间枯竭&#xff1b; &#xff08;4&#xff…

面试经典150题——二叉树展开为链表

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 因为题目中提到&#xff1a;展开后的单链表应该与二叉树 先序遍历 顺序相同&#xff0c;那么我们是不是就可以先先序遍历&#xff0c;然后按照先序遍历的节点一个一个赋值&#xff1f; 其实最简单的思路就是用一个结构按顺序存…

MySQL-锁篇

文章目录 表级锁和行级锁了解吗&#xff1f;有什么区别&#xff1f;行级锁使用有什么注意事项&#xff1f;InnoDB有哪几类行锁&#xff1f;共享锁和排他锁是什么&#xff1f;意向锁有什么用&#xff1f; 锁是一种常见的并发事务的控制方式 表级锁和行级锁了解吗&#xff1f;有什…

云计算时代,企业面临的云安全风险

如今&#xff0c;随着云计算等新兴科技的发展&#xff0c;不同类型企业间的关联越来越多&#xff0c;它们之间的业务边界已被打破&#xff0c;企业上云成为了大势所趋。云计算应用帮助企业改变了IT资源不集中的状况&#xff0c;同时&#xff0c;数据中心内存储的大量数据信息&a…

uniapp制作多选下拉框和富文本(短信页面)

实例 多选下拉框实现 http://t.csdnimg.cn/TNmcF 富文本实现 http://t.csdnimg.cn/Ei1iV

面试经典150题——分发糖果

面试经典150题 day15 题目来源我的题解方法一 两次不同方向的遍历&#xff08;应该是贪心&#xff09;方法二 贪心 题目来源 力扣每日一题&#xff1b;题序&#xff1a;135 我的题解 方法一 两次不同方向的遍历&#xff08;应该是贪心&#xff09; 遍历两次&#xff08;左→…

网络安全事件频发,让态势感知来提前洞察快速防护

一、引言 随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为社会各界普遍关注的焦点。近年来&#xff0c;网络安全事件频发&#xff0c;给个人、企业乃至国家带来了严重的损失。这些事件不仅揭示了网络安全领域的严峻挑战&#xff0c;也敲响了信息安全…

甘特图是什么?如何利用其优化项目管理流程?

甘特图是项目管理软件中十分常见的功能&#xff0c;可以说每一个项目经理都要学会使用甘特图才能更好的交付项目。什么是甘特图&#xff1f;甘特图用来做什么&#xff1f;简单来说一种将项目任务与时间关系直观表示的图表&#xff0c;直观地展示了任务进度和持续时间。 一、甘特…

基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于HMM隐马尔可夫模型的金融数据预测算法.程序实现HMM模型的训练&#xff0c;使用训练后的模型进行预测。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运…

C++:范围-based for 循环

范围-based for 循环是 C11 引入的一种循环语法&#xff0c;它简化了遍历容器和数组等序列的操作&#xff0c;使代码更加清晰和简洁。它通常用于遍历容器类&#xff08;如数组、向量、列表等&#xff09;中的元素&#xff0c;或者以范围的形式遍历初始化列表。 范围-based for …

MySQL 自建数据库慢日志分析

文章目录 前言1. 参数介绍1.1 慢日志参数1.2 慢日志切割 2. pt-query-digest2.1 离线分析2.2 在线分析2.3 常用参数 总结 前言 慢 SQL 是指 MySQL 中执行时间超过指定阈值的语句将被记录到 Slow log 文件中的查询。慢 SQL 的风险是可能随时都会因为某种原因而被触发&#xff0…

十八、QGIS的作用和下载

最近在学习webGIS的时候,发现路径文件是geoJSON文件,那么如果是你没有这个文件怎么办,从哪里能够获取呢,我最近就查询了文档,发现大多数都是shp转geoJSON,或者是osm转geoJSON,那如何去转换呢,就有两个方法,如果只关注QGiS,第一个方法可以忽略。 一、 安装ogr2ogr 具…

网络中其他协议

目录 DNS协议 域名简介 ICMP协议 ICMP功能 ICMP协议格式 ping命令 NAT技术 NATP NAT技术的限制 代理服务器 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&#xff0c;是一个用来将域名转化为IP地址的应用层协议。 为什么有这个协…

QT初识

通过图形化界面输出helloworld 既然学习了QT&#xff0c;那么自然要做经典的输出helloworld字符串的实验。 QT有两好几种方案输出helloworld&#xff0c;一种是通过图形化界面输出&#xff0c;一种是通过代码实现。 这里先了解图形化界面的方案。 创建项目后&#xff0c;点…

移动端适配之viewport

目录 盒模型&#xff1a;widthcontent&#xff08;padding border&#xff09; class"content-box"内容盒模型&#xff08;W3C盒&#xff09; class"border-box"边框盒模型&#xff08;IE 盒&#xff09; scroll滚动 window浏览器视窗&#xff1a;包括…

【WP】猿人学3_访问逻辑_推心置腹_罗生门

https://match.yuanrenxue.cn/match/3 探索 当我手动点击&#xff0c;可以发送请求&#xff0c;但是Fiddler重放攻击则无法成功 重点是&#xff0c;三次请求&#xff0c;数据完全一样 不愧说名字叫做“罗生门” 先研究一下这个错误请求的代码&#xff0c;在浏览器运行&#…

Leetcode 119 杨辉三角 II

目录 一、问题描述二、示例及约束三、代码方法一&#xff1a;递推方法二&#xff1a;线性递推 四、总结 一、问题描述 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。   在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。   自我…

BUUCTF-Misc20

[ACTF新生赛2020]NTFS数据流1 1.打开附件 是一堆文件&#xff0c;随便打开一个内容是flag不在这 2.pyton脚本 编写查找文件夹下一堆文件中那个文件藏有flag的Python脚本 import os def search_flag_files(folder_path, flag): flag_files [] for root, dirs, files …