比如有一个按钮点击事件,并且事件被传递到了多个回调中处理,那么:
- lv_event_get_target(e):总是指向那个被点击的按钮。
- lv_event_get_current_target(e):可能是按钮本身,也可能是其某个父容器,或者是响应了事件处理回调的任意中间层对象。
举例来说,一个容器上面有一个按钮:
lv_obj_t * contanier1 = lv_obj_create(nullptr);
lv_obj_set_style_bg_color(contanier1, lv_palette_main(LV_PALETTE_RED), 0);
lv_obj_align(contanier1,LV_ALIGN_TOP_MID,0,0);
lv_obj_t * btn = lv_btn_create(contanier1);
lv_obj_set_size(btn, 100, 60);
lv_obj_center(btn);
lv_obj_add_event_cb(btn, win_btn_event_callback, LV_EVENT_CLICKED, 0);
在按钮绑定的事件函数里:
static void win_btn_event_callback(lv_event_t* e)
{
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED)
{
lv_obj_t * obj = lv_event_get_target(e);//按钮
lv_obj_t * obj2 = lv_event_get_current_target(e);//容器
if(obj == obj2)
}
}
在这里两个函数返回的对象一样,都是按钮。
对象设置了 LV_OBJ_FLAG_EVENT_BUBBLE 标识,那么事件就会传递给父对象。
设置:
lv_obj_add_flag(btn, LV_OBJ_FLAG_EVENT_BUBBLE);
之后,可以在容器绑定的事件处理函数处理按钮的按下事件:
lv_obj_add_event_cb(contanier1, win_contanier_event_callback, LV_EVENT_CLICKED, 0);
static void win_contanier_event_callback(lv_event_t* e)
{
lv_event_code_t code = lv_event_get_code(e);
if (code == LV_EVENT_CLICKED)
{
lv_obj_t * obj = lv_event_get_target(e);//按钮
lv_obj_t * contanier = lv_event_get_current_target(e);//容器
if(lv_obj_get_child(contanier,0) == obj)
{
qDebug()<<"obj是contanier上面的按钮";
}
}
}
上面的代码点击容器对象本身会触发 LV_EVENT_CLICKED 事件,点击按钮也会触发该事件。
当点击按钮的时候会打印输出上面的内容。