20. 表格部件

一、表格部件

  在 LVGL中,表格部件是由一个个单元格组成的,表格部件的单元格中只能存放文本形式的内容,不支持存放其他任何类型的对象或者部件。表格部件由两个部分组成:主体背景LV_PART_MAIN)和 单元格LV_PART_ITEMS)。

  LVGL 官方提供了一些与表格部件相关 API。

lv_obj_t * lv_table_create(lv_obj_t * parent);                                  // 创建表格对象

void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt);             // 设置单元格的值
void lv_table_set_cell_value_fmt(lv_obj_t * obj, uint32_t row, uint32_t col, const char * fmt, ...);    // 格式化设置单元格的值
const char * lv_table_get_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col);                       // 获取单元格的值

#define lv_table_set_row_cnt                lv_table_set_row_count
void lv_table_set_row_count(lv_obj_t * obj, uint32_t row_cnt);                  // 设置行数

#define lv_table_get_row_cnt                lv_table_get_row_count
uint32_t lv_table_get_row_count(lv_obj_t * obj);                                // 获取行数

#define lv_table_set_col_cnt                lv_table_set_column_count
void lv_table_set_column_count(lv_obj_t * obj, uint32_t col_cnt);               // 设置列数

#define lv_table_get_col_cnt                lv_table_get_column_count
uint32_t lv_table_get_column_count(lv_obj_t * obj);                             // 获取列数

#define lv_table_set_col_width              lv_table_set_column_width
void lv_table_set_column_width(lv_obj_t * obj, uint32_t col_id, int32_t w);     // 设置列的宽度

#define lv_table_get_col_width              lv_table_get_column_width
int32_t lv_table_get_column_width(lv_obj_t * obj, uint32_t col);                // 获取列的宽度

void lv_table_add_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl);     // 向单元格添加控制位
void lv_table_clear_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl);   // 清除单元格的控制位
bool lv_table_has_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl);     // 判断单元格是否具有控制位

void lv_table_get_selected_cell(lv_obj_t * obj, uint32_t * row, uint32_t * col);                        // 获取选中的单元格

  我们可以使用 lv_table_create() 函数 创建表格部件

/**
 * @brief 创建表格对象
 * 
 * @param parent 指向父部件的指针
 * @return lv_obj_t* 指向表格部件的指针
 */
lv_obj_t * lv_table_create(lv_obj_t * parent);

  在默认的情况下,用户创建出表格部件,该表格中并没有任何的内容,如果我们想 在某个单元格中添加文本,则可调用 lv_table_set_cell_value() 函数。

/**
 * @brief 设置单元格的值
 * 
 * @param obj 指向表格部件的指针
 * @param row 行ID
 * @param col 列ID
 * @param txt 单元格文本内容
 */
void lv_table_set_cell_value(lv_obj_t * obj, uint32_t row, uint32_t col, const char * txt);

  在默认的情况下,用户创建出表格部件,该部件只拥有一个单元格,如果我们需要 设置单元格的行数和列数,可调用 lv_table_set_row_cnt()lv_table_set_col_cnt() 函数。

/**
 * @brief 设置行数
 * 
 * @param obj 指向表格部件的指针
 * @param row_cnt 行数
 */
void lv_table_set_row_cnt(lv_obj_t * obj, uint32_t row_cnt);
/**
 * @brief 设置列表
 * 
 * @param obj 指向表格部件的指针
 * @param col_cnt 列数
 */
void lv_table_set_col_cnt(lv_obj_t * obj, uint32_t col_cnt);

  在表格部件中,用户可通过 lv_table_set_col_width() 函数 设置某一列的宽度,而单元格的高度则根据单元格样式(字体、填充等)和行数自动计算出来的。

/**
 * @brief 设置列的宽度
 * 
 * @param obj 指向表格部件的指针
 * @param col_id 列ID
 * @param w 列宽
 */
void lv_table_set_col_width(lv_obj_t * obj, uint32_t col_id, int32_t w);

  合并单元格是指将指定的连续单元区域合并为 1 个单元格。

table部件单元格合并示意图

  如果 a 和 b 的单元格发生合并,合并之后的单元格归 a 单元格所有,而 b 单元格将被删除。在表格部件中,某一个单元格只能和右边的单元格进行合并,不能垂直合并单元格。用户需要合并单元格,可调用 lv_table_add_cell_ctrl() 函数。

/**
 * @brief 向单元格添加控制位
 * 
 * @param obj 指向表格控件的指针
 * @param row 行ID
 * @param col 列ID
 * @param ctrl 控制位
 */
void lv_table_add_cell_ctrl(lv_obj_t * obj, uint32_t row, uint32_t col, lv_table_cell_ctrl_t ctrl);

二、实验例程

#include "lvgl.h"
#include "lv_port_disp_template.h"
#include "lv_port_indev_template.h"

int main(void)
{
    HAL_Init();
    System_Clock_Init(8, 336, 2, 7);
    Delay_Init(168);

    SPI_Simulate_Init();
    // SRAM_Init();
    TIM_Base_Init(&g_tim6_handle, TIM6, 83, 999);
    __HAL_TIM_CLEAR_IT(&g_tim6_handle, TIM_IT_UPDATE);                          // 清除更新中断标志位
    HAL_TIM_Base_Start_IT(&g_tim6_handle);                                      // 使能更新中断,并启动计数器

    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();

    // 测试代码
    lv_obj_t *table = lv_table_create(lv_scr_act());                            // 创建表格部件

    lv_obj_center(table);                                                       // 表格控件居中对齐

    lv_table_set_row_cnt(table, 3);                                             // 设置行数
    lv_table_set_col_cnt(table, 2);                                             // 设置列数

    lv_table_set_cell_value(table, 0, 0, "name");                               // 设置指定单元格文本内容
    lv_table_set_cell_value(table, 0, 1, "age");                                // 设置指定单元格文本内容

    lv_table_set_cell_value(table, 1, 0, "Sakura");
    lv_table_set_cell_value(table, 1, 1, "10");

    lv_table_add_cell_ctrl(table, 2, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);        // 向右合并单元格

    while (1)
    {
        lv_timer_handler();
        Delay_ms(5);
    }
  
    return 0;
}
posted @ 2024-08-03 20:10  星光映梦  阅读(73)  评论(0编辑  收藏  举报