找回密码
 立即注册
首页 业界区 科技 LVGL-表格

LVGL-表格

痕厄 2025-6-15 20:30:07
lv_table_create

用于创建表格
  1. lv_obj_t * lv_table_create(lv_obj_t * parent);
  2. //parent:父对象的指针
  3. //ret:返回指向新创建的表格对象的指针
复制代码
lv_table_set_cell_value

用于设置表格(lv_table)单元格内容的函数。通过此函数,可以为表格的每个单元格设置文本内容
  1. void lv_table_set_cell_value(lv_obj_t * table, uint32_t row, uint32_t col, const char * txt);
  2. //table:指向表格对象的指针
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //txt:要设置的文本内容
复制代码
lv_table_set_cell_value_fmt

用于设置表格(lv_table)单元格内容的函数,支持格式化字符串。它类似于 C 语言中的 printf 函数,可以将变量格式化为字符串并设置到单元格中
  1. void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint16_t row, uint16_t col, const char * fmt, ...);
  2. //obj:指向表格对象的指针
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //fmt:格式化字符串,类似于 printf 中的格式化字符串,例如 "%d"、"%s" 等
复制代码
lv_table_set_row_cnt

用于设置表格(lv_table)行数
  1. void lv_table_set_row_cnt(lv_obj_t * table, uint16_t row_cnt);
  2. //table:指向表格对象的指针
  3. //row_cnt:要设置的行数
复制代码
lv_table_set_col_cnt

用于设置表格(lv_table)列数
  1. void lv_table_set_col_cnt(lv_obj_t * table, uint16_t col_cnt);
  2. //table:指向表格对象的指针
  3. //col_cnt:要设置的列数
复制代码
lv_table_set_col_width

用于设置表格(lv_table)某一列的宽度的函数
  1. void lv_table_set_col_width(lv_obj_t * table, uint16_t col, uint16_t width);
  2. //table:指向表格对象的指针
  3. //col:要设置宽度的列索引(从 0 开始)
  4. //width:该列的宽度,单位为像素
复制代码
lv_table_add_cell_ctrl

用于向表格(lv_table)的指定单元格添加控制标志的函数。这些控制标志可以改变单元格的行为或外观,例如合并单元格或裁剪文本
  1. void lv_table_add_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl);
  2. //obj:指向表格对象的指针。
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //ctrl:要添加的控制标志
  6. /*
  7. LV_TABLE_CELL_CTRL_MERGE_RIGHT:将当前单元格与右侧单元格合并。
  8. LV_TABLE_CELL_CTRL_TEXT_CROP:裁剪单元格内的文本(实际效果可能因版本而异)。
  9. LV_TABLE_CELL_CTRL_CUSTOM_1 到 LV_TABLE_CELL_CTRL_CUSTOM_4:自定义控制标志,可用于自定义单元格的行为
  10. */
复制代码
lv_table_clear_cell_ctrl

用于清除表格(lv_table)单元格的控制标志
  1. void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl);
  2. //obj:指向表格对象的指针。
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //ctrl:要清除的控制标志
复制代码
lv_table_set_cell_user_data

用于为表格(lv_table)的单元格设置用户自定义数据的函数。通过此函数,可以将任意数据(例如指针或整数)与表格的单元格关联起来,以便在事件处理或其他逻辑中使用。
  1. void lv_table_set_cell_user_data(lv_obj_t * table, uint16_t row, uint16_t col, void * user_data);
  2. //table:指向表格对象的指针。
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //user_data:要设置的用户自定义数据。可以是任意指针或整数
复制代码
lv_table_get_cell_value

用于获取表格(lv_table)单元格内容的函数
  1. const char * lv_table_get_cell_value(const lv_obj_t * table, uint16_t row, uint16_t col);
  2. //table:指向表格对象的指针
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //ret:返回一个指向单元格内容的字符串。如果单元格没有内容,返回值可能是 NULL 或空字符串
复制代码
lv_table_get_row_cnt

用于获取表格(lv_table)当前行数
  1. uint16_t lv_table_get_row_cnt(const lv_obj_t * table);
  2. //table:指向表格对象的指针
  3. //ret:返回表格的当前行数
复制代码
lv_table_get_col_cnt

用于获取表格(lv_table)当前列数
  1. uint16_t lv_table_get_col_cnt(const lv_obj_t * table);
  2. //table:指向表格对象的指针
  3. //ret:返回表格的当前列数
复制代码
lv_table_get_col_width

用于获取表格(lv_table)某一列宽度的函数
  1. lv_coord_t lv_table_get_col_width(const lv_obj_t * table, uint16_t col_id);
  2. //table:指向表格对象的指针。
  3. //col_id:要获取宽度的列索引(从 0 开始)
  4. //ret:返回指定列的宽度,单位为像素
复制代码
lv_table_has_cell_ctrl

用于检查表格(lv_table)的某个单元格是否具有特定控制标志的函数。通过此函数,可以查询单元格是否设置了如合并单元格或裁剪文本等控制标志
  1. bool lv_table_has_cell_ctrl(const lv_obj_t * table, uint16_t row, uint16_t col, lv_table_cell_ctrl_t ctrl);
  2. //table:指向表格对象的指针
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //ctrl:要检查的控制标志
  6. //LV_TABLE_CELL_CTRL_MERGE_RIGHT:检查单元格是否与右侧单元格合并
  7. //LV_TABLE_CELL_CTRL_TEXT_CROP:检查单元格文本是否被裁剪
  8. //LV_TABLE_CELL_CTRL_CUSTOM_1 到 LV_TABLE_CELL_CTRL_CUSTOM_4:检查自定义控制标志
  9. //ret:返回一个布尔值:true:表示单元格具有指定的控制标志。false:表示单元格不具有指定的控制标志
复制代码
lv_table_get_selected_cell

用于获取表格(lv_table)当前选中单元格的行和列索引的函数
  1. bool lv_table_get_selected_cell(const lv_obj_t * table, uint16_t * row, uint16_t * col);
  2. //table:指向表格对象的指针
  3. //row:指向一个 uint16_t 类型的变量,用于存储选中单元格的行索引
  4. //col:指向一个 uint16_t 类型的变量,用于存储选中单元格的列索引
复制代码
lv_table_get_cell_user_data

用于获取表格(lv_table)单元格的用户自定义数据的函数
  1. void* lv_table_get_cell_user_data(const lv_obj_t * table, uint16_t row, uint16_t col);
  2. //table:指向表格对象的指针
  3. //row:单元格所在的行索引(从 0 开始)
  4. //col:单元格所在的列索引(从 0 开始)
  5. //ret:返回单元格的用户自定义数据的指针。如果未设置用户数据,返回 NULL
复制代码
  1. /**
  2. * 使用表格创建轻量级列表示例
  3. * 实现了带开关状态的高效列表显示
  4. */
  5. #if LV_USE_TABLE && LV_BUILD_EXAMPLES
  6. #define ITEM_CNT 200  // 列表项数量
  7. // 自定义绘制事件回调 - 用于绘制单元格中的开关控件
  8. static void draw_event_cb(lv_event_t * e)
  9. {
  10.     lv_obj_t * obj = lv_event_get_target(e);  // 获取触发事件的表格对象
  11.     lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);  // 获取绘制部件描述符
  12.    
  13.     // 如果正在绘制单元格内容
  14.     if(dsc->part == LV_PART_ITEMS) {
  15.         // 检查当前单元格是否设置了自定义控制标志1(表示开关状态)
  16.         bool chk = lv_table_has_cell_ctrl(obj, dsc->id, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
  17.         // 初始化矩形绘制描述符
  18.         lv_draw_rect_dsc_t rect_dsc;
  19.         lv_draw_rect_dsc_init(&rect_dsc);
  20.         
  21.         // 根据开关状态设置背景颜色
  22.         rect_dsc.bg_color = chk ? lv_theme_get_color_primary(obj) : lv_palette_lighten(LV_PALETTE_GREY, 2);
  23.         rect_dsc.radius = LV_RADIUS_CIRCLE;  // 设置圆角为圆形,形成开关背景
  24.         
  25.         // 定义开关控件区域
  26.         lv_area_t sw_area;
  27.         sw_area.x1 = dsc->draw_area->x2 - 50;  // 靠右对齐
  28.         sw_area.x2 = sw_area.x1 + 40;
  29.         sw_area.y1 = dsc->draw_area->y1 + lv_area_get_height(dsc->draw_area) / 2 - 10;  // 垂直居中
  30.         sw_area.y2 = sw_area.y1 + 20;
  31.         
  32.         // 绘制开关背景
  33.         lv_draw_rect(dsc->draw_ctx, &rect_dsc, &sw_area);
  34.         // 设置开关按钮颜色
  35.         rect_dsc.bg_color = lv_color_white();
  36.         
  37.         // 根据开关状态调整按钮位置
  38.         if(chk) {
  39.             sw_area.x2 -= 2;
  40.             sw_area.x1 = sw_area.x2 - 16;  // 打开状态:按钮靠右
  41.         }
  42.         else {
  43.             sw_area.x1 += 2;
  44.             sw_area.x2 = sw_area.x1 + 16;  // 关闭状态:按钮靠左
  45.         }
  46.         sw_area.y1 += 2;
  47.         sw_area.y2 -= 2;  // 缩小一点,形成内凹效果
  48.         
  49.         // 绘制开关按钮
  50.         lv_draw_rect(dsc->draw_ctx, &rect_dsc, &sw_area);
  51.     }
  52. }
  53. // 单元格值改变事件回调 - 处理开关状态切换
  54. static void change_event_cb(lv_event_t * e)
  55. {
  56.     lv_obj_t * obj = lv_event_get_target(e);  // 获取触发事件的表格对象
  57.     uint16_t col, row;
  58.     lv_table_get_selected_cell(obj, &row, &col);  // 获取选中单元格坐标
  59.    
  60.     // 检查当前开关状态
  61.     bool chk = lv_table_has_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
  62.    
  63.     // 切换开关状态
  64.     if(chk) lv_table_clear_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
  65.     else lv_table_add_cell_ctrl(obj, row, 0, LV_TABLE_CELL_CTRL_CUSTOM_1);
  66. }
  67. /**
  68. * 使用表格创建轻量级列表
  69. */
  70. void lv_example_table_2(void)
  71. {
  72.     /*内存使用监测*/
  73.     lv_mem_monitor_t mon1;
  74.     lv_mem_monitor(&mon1);  // 记录初始内存状态
  75.     uint32_t t = lv_tick_get();  // 记录开始时间
  76.     // 创建表格对象
  77.     lv_obj_t * table = lv_table_create(lv_scr_act());
  78.     // 设置表格高度,使其可滚动
  79.     lv_obj_set_size(table, LV_SIZE_CONTENT, 200);
  80.     // 设置列宽和行列数量
  81.     lv_table_set_col_width(table, 0, 150);
  82.     lv_table_set_row_cnt(table, ITEM_CNT);  // 预分配足够行数,避免动态内存重分配
  83.     lv_table_set_col_cnt(table, 1);
  84.     // 移除单元格按下状态样式,使用自定义绘制
  85.     lv_obj_remove_style(table, NULL, LV_PART_ITEMS | LV_STATE_PRESSED);
  86.     // 填充表格数据
  87.     uint32_t i;
  88.     for(i = 0; i < ITEM_CNT; i++) {
  89.         lv_table_set_cell_value_fmt(table, i, 0, "Item %"LV_PRIu32, i + 1);  // 设置单元格文本
  90.     }
  91.     // 将表格居中对齐
  92.     lv_obj_align(table, LV_ALIGN_CENTER, 0, -20);
  93.     // 添加自定义绘制事件回调
  94.     lv_obj_add_event_cb(table, draw_event_cb, LV_EVENT_DRAW_PART_END, NULL);
  95.    
  96.     // 添加值改变事件回调
  97.     lv_obj_add_event_cb(table, change_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
  98.     // 内存使用监测
  99.     lv_mem_monitor_t mon2;
  100.     lv_mem_monitor(&mon2);  // 记录完成后内存状态
  101.     // 计算内存使用和时间消耗
  102.     uint32_t mem_used = mon1.free_size - mon2.free_size;
  103.     uint32_t elaps = lv_tick_elaps(t);
  104.     // 创建信息标签显示性能数据
  105.     lv_obj_t * label = lv_label_create(lv_scr_act());
  106.     lv_label_set_text_fmt(label, "%"LV_PRIu32" items were created in %"LV_PRIu32" ms\n"
  107.                           "using %"LV_PRIu32" bytes of memory",
  108.                           ITEM_CNT, elaps, mem_used);
  109.     // 将标签放置在底部
  110.     lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -10);
  111. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册