lv_table

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

一个按钮来为表格增加新的行。

完整代码示例

c 复制代码
#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版本调整后的示例代码,它应该可以直接在您的环境中使用:

c 复制代码
#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库及相关的显示和输入系统。

相关推荐
少了一只鹅3 小时前
字符函数和字符串函数
c语言·算法
双叶8364 小时前
(C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)(网页版预告)(html)(js)(json)
c语言·javascript·数据结构·html·json
belldeep10 小时前
如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
c语言·开发语言
小狗祈祷诗15 小时前
day22-数据结构之 栈&&队列
c语言·数据结构
AI+程序员在路上16 小时前
XML介绍及常用c及c++库
xml·c语言·c++
小刘要努力呀!20 小时前
嵌入式开发学习(第二阶段 C语言基础)
c语言·学习·算法
草莓熊Lotso20 小时前
【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
c语言·开发语言·经验分享·笔记·其他
小秋学嵌入式-不读研版21 小时前
C42-作业练习
c语言·开发语言·笔记
QQ_4376643141 天前
Linux下可执行程序的生成和运行详解(编译链接汇编图解)
linux·运维·c语言·汇编·caffe
越城1 天前
深入理解二叉树:遍历、存储与算法实现
c语言·数据结构·算法