lv_table

通过点击lv_table的某一行来选中这一行,以及通过点击另外创建的按钮来删除选中的这一行数据。在table_event_cb回调函数中,我们通过检测点击事件发生的行和列来确定被点击的行,然后在按钮的事件处理器btn_event_cb中,根据之前保存的选中行索引来删除相应行的数据,并适当地更新表格展示。
一个按钮来为表格增加新的行。

完整代码示例

#include "lvgl/lvgl.h"lv_obj_t *table;
static uint16_t selected_row = LV_TABLE_CELL_NONE; // 用于保存选中行的索引// 表格点击事件回调函数
static void table_event_cb(lv_event_t *e) {lv_obj_t * obj = lv_event_get_target(e);uint16_t row;uint16_t col;// 获取点击事件发生的行和列lv_res_t res = lv_table_get_pressed_cell(obj, &row, &col);if(res == LV_RES_OK && col != LV_TABLE_CELL_NONE && row != LV_TABLE_CELL_NONE) {// 将选中的行索引保存起来selected_row = row;// 可以在这里改变行的样式,模拟选中效果(可选)lv_obj_add_style(obj, &style_selected, LV_PART_ITEMS | (row << LV_STYLE_ID_BITS));// 注意: 上面的样式改变代码是示意性的,你可能需要根据实际情况调整}
}// 按钮事件处理器,用于删除选中的行
static void btn_delete_event_cb(lv_event_t * e) {if (selected_row != LV_TABLE_CELL_NONE && selected_row < lv_table_get_row_cnt(table)) {uint16_t row_cnt = lv_table_get_row_cnt(table);// 将选中行之后的每一行的内容向上移动一行for (uint16_t i = selected_row; i < row_cnt - 1; i++) {for (uint16_t j = 0; j < lv_table_get_col_cnt(table); j++) {const char * cell_text = lv_table_get_cell_value(table, i + 1, j);lv_table_set_cell_value(table, i, j, cell_text);}}// 减少表格的总行数以删除最后一行lv_table_set_row_cnt(table, row_cnt - 1);selected_row = LV_TABLE_CELL_NONE; // 重置选中行的索引}
}// 按钮事件处理器,用于增加一行到表格的末尾
static void btn_add_row_event_cb(lv_event_t * e) {uint16_t row_cnt = lv_table_get_row_cnt(table);lv_table_set_row_cnt(table, row_cnt + 1);lv_table_set_cell_value(table, row_cnt, 0, "New Item");lv_table_set_cell_value(table, row_cnt, 1, "Value");
}void create_ui(void) {// 创建并设置表格table = lv_table_create(lv_scr_act());lv_obj_add_event_cb(table, table_event_cb, LV_EVENT_CLICKED, NULL);lv_obj_align(table, LV_ALIGN_CENTER, 0, 0);// 添加示例数据到表格中lv_table_set_col_cnt(table, 2);lv_table_set_row_cnt(table, 4);lv_table_set_cell_value(table, 0, 0, "Name");lv_table_set_cell_value(table, 0, 1, "Value");// 这里可以根据需要添加更多的表格数据...// 创建删除按钮并为其设置事件处理器lv_obj_t *btn_delete = lv_btn_create(lv_scr_act());lv_obj_add_event_cb(btn_delete, btn_delete_event_cb, LV_EVENT_CLICKED, NULL);lv_obj_align(btn_delete, LV_ALIGN_BOTTOM_MID, 0, -50);lv_obj_set_size(btn_delete, 100, 50);lv_obj_t *label_delete = lv_label_create(btn_delete);lv_label_set_text(label_delete, "Delete Row");lv_obj_center(label_delete);// 创建增加按钮并为其设置事件处理器lv_obj_t *btn_add = lv_btn_create(lv_scr_act());lv_obj_add_event_cb(btn_add, btn_add_row_event_cb, LV_EVENT_CLICKED, NULL);lv_obj_align_to(btn_add, btn_delete, LV_ALIGN_OUT_RIGHT_MID, 10, 0);lv_obj_set_size(btn_add, 100, 50);lv_obj_t *label_add = lv_label_create(btn_add);lv_label_set_text(label_add, "Add Row");lv_obj_center(label_add);
}// 在适当位置调用create_ui()来初始化界面
create_ui();

感谢您提供初始代码和更多详细信息。由于您使用的是LVGL的8.3.1版本,有些API可能与我先前提供的示例略有不同。

下面是根据LVGL 8.3.1版本调整后的示例代码,它应该可以直接在您的环境中使用:

#include "lvgl/lvgl.h"lv_obj_t *table;
static uint16_t selected_row = LV_TABLE_CELL_NONE;// 表格点击事件回调函数
static void table_event_cb(lv_event_t *e) {lv_obj_t *obj = lv_event_get_target(e);uint16_t row;uint16_t col;lv_res_t res = lv_table_get_pressed_cell(obj, &row, &col);if(res == LV_RES_OK && col != LV_TABLE_CELL_NONE && row != LV_TABLE_CELL_NONE) {selected_row = row;lv_obj_add_state(obj, LV_STATE_CHECKED);}
}static void btn_delete_event_cb(lv_event_t * e) {if (selected_row != LV_TABLE_CELL_NONE && selected_row < lv_table_get_row_cnt(table)) {uint16_t row_cnt = lv_table_get_row_cnt(table);for (uint16_t i = selected_row; i < row_cnt - 1; i++) {for (uint16_t j = 0; j < lv_table_get_col_cnt(table); j++) {const char *cell_text = lv_table_get_cell_text(table, i + 1, j);lv_table_set_cell_value(table, i, j, cell_text);}}lv_table_set_row_cnt(table, row_cnt - 1);selected_row = LV_TABLE_CELL_NONE;}
}static void btn_add_row_event_cb(lv_event_t * e) {uint16_t row_cnt = lv_table_get_row_cnt(table);lv_table_set_row_cnt(table, row_cnt + 1);lv_table_set_cell_value(table, row_cnt, 0, "New Item");lv_table_set_cell_value(table, row_cnt, 1, "Value");
}void create_ui(void) {table = lv_table_create(lv_scr_act());lv_obj_add_event_cb(table, table_event_cb, LV_EVENT_CLICKED, NULL);lv_obj_align(table, LV_ALIGN_CENTER, 0, 0);lv_table_set_col_cnt(table, 2);lv_table_set_row_cnt(table, 4);lv_table_set_cell_value(table, 0, 0, "Name");lv_table_set_cell_value(table, 0, 1, "Value");lv_obj_t *btn_delete = lv_btn_create(lv_scr_act());lv_obj_add_event_cb(btn_delete, btn_delete_event_cb, LV_EVENT_CLICKED, NULL);lv_obj_align(btn_delete, LV_ALIGN_BOTTOM_MID, 0, -50);lv_obj_set_size(btn_delete, 100, 50);lv_obj_t *label_delete = lv_label_create(btn_delete);lv_label_set_text(label_delete, "Delete Row");lv_obj_center(label_delete);lv_obj_t *btn_add = lv_btn_create(lv_scr_act());lv_obj_add_event_cb(btn_add, btn_add_row_event_cb, LV_EVENT_CLICKED, NULL);lv_obj_align_to(btn_add, btn_delete, LV_ALIGN_OUT_RIGHT_MID, 10, 0);lv_obj_set_size(btn_add, 100, 50);lv_obj_t *label_add = lv_label_create(btn_add);lv_label_set_text(label_add, "Add Row");lv_obj_center(label_add);
}// 主函数里调用create_ui()初始化UI
int main() {lv_init();// Your code to initialize display, input drivers...create_ui();while(1) {lv_task_handler();sleep(5);}return 0;
}

这个代码示例包含创建UI的函数create_ui(),该函数可以在您的主函数或初始化部分调用。以上代码应该与LVGL 8.3.1版本完美兼容。请确保您已经初始化了LVGL库及相关的显示和输入系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P3811 [模板] 模意义下的乘法逆元

【模板】模意义下的乘法逆元 题目描述 给定 n , p n,p n,p 求 1 ∼ n 1\sim n 1∼n 中所有整数在模 p p p 意义下的乘法逆元。 这里 a a a 模 p p p 的乘法逆元定义为 a x ≡ 1 ( m o d p ) ax\equiv1\pmod p ax≡1(modp) 的解。 输入格式 一行两个正整数 n , p n,…

Qt——Qt网络编程之获取本机网络信息(通过QHostInfo和QNetworkInterface 类获取本地网络所有接口信息)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》

asp.net core mvc 路由

在ASP.NET Core MVC中&#xff0c;路由是一项核心功能&#xff0c;它负责将进来的HTTP请求映射到相应的控制器和动作方法上。ASP.NET Core支持两种路由方式&#xff1a;传统的基于模板的路由&#xff08;约定路由&#xff09;和属性路由。 1. 基于约定的路由 在Startup.Confi…

【001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂】

001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂 文章目录 001_IoT/物联网通信协议基础: HTTP、Websocket、MQTT、AMQP、COAP、LWM2M一文搞懂创作背景通信模型ISO/OSI七层模型 和 TCP/IP四层模型网络通信数据包格式&#xff08;Ethernet II&…

【opencv GPU】测测你的opencv-GPU 版本每秒处理帧数 大概多少?

在使用OpenCV的cv2.dnn.Net类从ONNX模型文件创建网络时&#xff0c;如果你想要启用GPU加速&#xff0c;你需要确保OpenCV在安装时已经包含了GPU支持。这通常意味着你需要从源代码编译OpenCV&#xff0c;并确保在编译过程中启用了CUDA支持。 以下是如何在OpenCV中启用GPU加速的…

20240421阿夏的CSDN创作纪念日(3周年)

缘 提示&#xff1a;可以和大家分享最初成为创作者的初心 3年前我写下第一篇CSDN&#xff0c;开启了Python研究之旅win10系统64位&#xff08; 惠普&#xff09;台式电脑自动开机、关机图文详细解&#xff08;一&#xff09;_惠普主板设置自动开机-CSDN博客文章浏览阅读4.2k次…

对观察者模式的理解

目录 一、场景1、题目描述 【[案例来源](https://kamacoder.com/problempage.php?pid1075)】2、输入描述3、输出描述4、输入示例5、输出示例 二、实现三、更复杂的场景 【[案例来源](https://refactoringguru.cn/design-patterns/observer/java/example#example-0--listeners-…

深入OceanBase内部机制:资源隔离实现的方式总结

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 1. 为何HTAP需要资源隔离2. OceanBase的资源隔离机制概述租户间资源隔离租户内资源隔离物理资源隔离大查询请求的隔离优先级…

26.ELF文件解析

ELF文件及objdump/readelf命令 文章目录 ELF文件及objdump/readelf命令ELF文件结构分析使用od命令读取ELF文件使用readelf命令读取ELF文件使用objdump命令分析ELF文件reference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; ELF(Executa…

4月21敲一篇猜数字游戏,封装函数,void,无限循环,快去体验体验

今天敲一篇猜数字游戏 目录 今天敲一篇猜数字游戏 1.打开先学goto语句&#xff1a; 2.开干&#xff1a; 首次我们学习随机数&#xff1a; 讲解一下&#xff1a; 改用srand; 加入时间变量&#xff1a; 获取时间&#xff1a;哈​编辑 3.我本来想已近够完美了&#xff0…

Flink学习(七)-单词统计

前言 Flink是流批一体的框架。因此既可以处理以流的方式处理&#xff0c;也可以按批次处理。 一、代码基础格式 //1st 设置执行环境 xxxEnvironment env xxxEnvironment.getEnvironment;//2nd 设置流 DataSource xxxDSenv.xxxx();//3rd 设置转换 Xxx transformation xxxDS.…

Spring Boot中接收各种各样的参数

一、接收json参数&#xff0c;封装为Map 1.1、核心代码 /*** 接收json参数&#xff0c;封装为Map* param servletRequest* return* throws Exception*/ PostMapping("/getParam") public R getParam(HttpServletRequest servletRequest) throws Exception {Map<…

Bootstrap 5 保姆级教程(十二):弹出框 消息弹窗

一、弹出框 1.1 创建弹出框 通过向元素添加 data-bs-toggle"popover" 来来创建弹出框。 title 属性的内容为弹出框的标题&#xff0c;data-bs-content 属性显示了弹出框的文本内容&#xff1a; 注意: 弹出框要写在 JavaScript 的初始化代码里。 以下实例可以在文…

NLP 文本表征方式

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;将文本转换成计算机能够理解和处理的格式是一个基本的步骤。这个过程通常被称为文本表征或文本向量化。下面&#xff0c;我将详细介绍几种常见的文本表征方法&#xff0c;并提供一些例子来说明这些技术是如何应用的。…

投入产出表的分析要点有哪些

投入产出分析是利用投入产出表、投入产出系数和投入产出模型&#xff0c;对国民经济各部门之间的技术经济联系和影响进行分析的一种经济数据分析方法。 一、什么是投入产出表 我国的投入产出表是描述国民经济中各种产品的来源与使用去向的棋盘式平衡表 , 是产品部门 产品部门…

【已解决】电脑设置notepad++默认打开txt

1、以管理员的方式打开notepad 步骤&#xff1a;打开设置 -> 首选项 -> 文件关联 2、 设置Notepad默认打开 按照以下步骤将Notepad设置为默认打开.txt文件&#xff1a; 右键单击任何一个.txt文件。选择“属性”。在“常规”选项卡中&#xff0c;找到“打开方式”&#…

【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数&#xff1a; N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…

VR全景:为户外游玩体验插上科技翅膀

随着VR全景技术的愈发成熟&#xff0c;无数人感到惊艳&#xff0c;也让各行各业看到了一片光明的发展前景。尤其是越来越多的文旅景区开始引入VR全景技术&#xff0c;相较于以往的静态风景图&#xff0c;显然现在的VR全景结合了动态图像和声音更加吸引人。 VR全景技术正在逐步改…

密码学 | 承诺:Pedersen 承诺 + ZKP

​ &#x1f951;原文&#xff1a;Toward Achieving Anonymous NFT Trading &#x1f951;写在前面&#xff1a;看了篇 22 年 SCI 3 区论文&#xff0c;里面提到在 Pedersen 承诺的揭示阶段可以使用零知识证明&#xff0c;而不必揭示消息明文和随机数。姑且记录一下这个方法。…

Dijkstra算法求最短路

Dijkstra算法可以在图中寻找一个节点&#xff08;称为“源节点”&#xff09;到所有其它节点的最短路径。 文章目录 前言 一、Dijkstra算法是什么&#xff1f; 二、问题介绍 三、朴素版Dijkstra算法 1.图的存储 2.算法实现 四、使用步骤 1.代码如下&#xff08;示例&#xff09…