• 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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    感谢您提供初始代码和更多详细信息。由于您使用的是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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

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

  • 相关阅读:
    手写RPC框架之泛化调用
    力扣常见算法题
    《利息理论》指导 TCP 拥塞控制
    python对excel数据表进行数据清洗
    MessageBox的模版语法上如何注册事件
    工程机械流通行业BI经营分析框架(一)四大关注方向
    java计算机毕业设计高校学生智慧党建系统设计与开发MyBatis+系统+LW文档+源码+调试部署-++
    【JVM调优实战100例】04——方法区调优实战(上)
    MySQL是如何保证主从一致的
    游戏建模与动画建模的区别,小白学建模前一定要知道
  • 原文地址:https://blog.csdn.net/u012579721/article/details/137932580