lvgl单击表格改变颜色,双击弹窗

要实现这个功能,需要几个步骤。以下是使用 LVGL 8.3 版本完成此功能的示例代码: 

#include "lvgl/lvgl.h" 

static void table_event_cb(lv_event_t * e);
static void mbox_event_cb(lv_event_t * e);

static uint16_t selected_row = LV_TABLE_CELL_NONE;
static lv_obj_t * table1;
static lv_obj_t * mbox = NULL;

void create_table_and_styles(void) {
    // 创建一个新的样式
    static lv_style_t style_table_bg;
    lv_style_init(&style_table_bg);
    lv_style_set_bg_opa(&style_table_bg, LV_OPA_COVER);
    lv_style_set_bg_color(&style_table_bg, lv_palette_main(LV_PALETTE_BLUE));
    lv_style_set_text_color(&style_table_bg, lv_color_black());
    
    // 创建表格
    table1 = lv_table_create(lv_scr_act());
    lv_table_set_col_cnt(table1, 4);  // 假定有4列
    lv_table_set_row_cnt(table1, 10); // 假定有10行
    lv_obj_add_style(table1, &style_table_bg, 0);  // 添加样式到表格
    
    // 设置表格满屏,根据需要扩展
    lv_obj_set_size(table1, LV_PCT(100), LV_PCT(100));
    lv_obj_align(table1, LV_ALIGN_CENTER, 0, 0);
    
    // 设置表格单元格的内容,此处以文本"Cell x-y"为例
    for(uint16_t col = 0; col < lv_table_get_col_cnt(table1); col++) {
        for(uint16_t row = 0; row < lv_table_get_row_cnt(table1); row++) {
            lv_table_set_cell_value_fmt(table1, row, col, "Cell %d-%d", row, col);
        }
    }
    
    // 设置表格的事件回调
    lv_obj_add_event_cb(table1, table_event_cb, LV_EVENT_CLICKED, NULL);
}

// 表格的事件回调函数
static void table_event_cb(lv_event_t * e) {
    lv_obj_t * obj = lv_event_get_target(e);
    uint16_t col, row;
    lv_res_t res = lv_table_get_pressed_cell(obj, &row, &col);  // 获取被按下的单元格
    if(res == LV_RES_OK) {
        if(selected_row == row) {
            if(mbox == NULL) {
                mbox = lv_msgbox_create(NULL, "Hello", "This is a message box.", NULL, true);
                lv_obj_set_size(mbox, LV_PCT(50), LV_PCT(25));  // 设置MSGBOX大小为屏幕的四分之一
                lv_obj_center(mbox); // 居中显示
                lv_obj_add_event_cb(mbox, mbox_event_cb, LV_EVENT_DELETE, NULL); // 设置事件回调,来处理关闭消息盒
            }
        } else {
            selected_row = row;
            
            // 为选中行设置新的风格
            static lv_style_t style_selected;
            lv_style_init(&style_selected);
            lv_style_set_bg_opa(&style_selected, LV_OPA_COVER);
            lv_style_set_bg_color(&style_selected, lv_palette_lighten(LV_PALETTE_GREY, 1));
            lv_style_set_border_width(&style_selected, 0);

            // 移除之前的行样式并应用新的样式
            for(uint16_t cell_col = 0; cell_col < lv_table_get_col_cnt(obj); cell_col++) {
                lv_obj_clear_state(lv_table_get_cell_obj(obj, selected_row, cell_col), LV_STATE_CHECKED);
                lv_obj_add_style(lv_table_get_cell_obj(obj, selected_row, cell_col), &style_selected, LV_STATE_CHECKED);
                lv_obj_add_state(lv_table_get_cell_obj(obj, selected_row, cell_col), LV_STATE_CHECKED);
            }
        }
    } else {
        selected_row = LV_TABLE_CELL_NONE; // 在表格外点击意味着没有选择;
    }

    // 重置非选中行的风格
    for(uint16_t cell_row = 0; cell_row < lv_table_get_row_cnt(obj); cell_row++) {
        if(cell_row != selected_row) {
            for(uint16_t cell_col = 0; cell_col < lv_table_get_col_cnt(obj); cell_col++) {
                lv_obj_clear_state(lv_table_get_cell_obj(obj, cell_row, cell_col), LV_STATE_CHECKED);
            }
        }
    }
}

// 消息框的事件回调
static void mbox_event_cb(lv_event_t * e) {
    if(lv_event_get_code(e) == LV_EVENT_DELETE && lv_event_get_target(e) == mbox) {
        mbox = NULL;
    }
}

// 创建表格和样式
create_table_and_styles();


 

以上是一个基本的示例代码。在这个代码中,我们定义了一个表格和对应的样式,创建了一个表格,并设置了它的尺寸和样式,并填充了一些假设的单元格内容。我们还添加了一个事件回调函数来处理当表格单元格被点击时的事件。然后我们定义了一个事件回调函数,当点击消息框关闭按钮时将消息框设置为  NULL 。

未经运行测试,仅供思考

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值