lvgl 自定义控制表格行高、颜色和外框样式

2023-10-26

lvgl 自定义控制表格行高、颜色和外框样式

lvgl版本:8.3.7
lvgl自带表格控件能够指定列宽,但是表格行高是根据内容动态渲染的。

表格自带样式如图,带有蓝色的外框和白底。
在这里插入图片描述

如果想要手动控制表格行高、颜色和外框等属性,需要监听表格绘制事件,在事件中覆盖属性。下面给出相关代码:

#include "table_oper.h"

 // 点击事件监听函数
void tbl_clicked_style_handler(lv_event_t *e) {
    lv_obj_t *table = lv_event_get_target(e);
    Style *style = lv_event_get_user_data(e);

    Common_Style *common_style = style->common_style;
    Table_Style *exclusive_style = style->exclusive_style;

    // 读取被点击的单元格,存到变量中
    lv_table_get_selected_cell(table, &exclusive_style->click_row, &exclusive_style->click_col);
}

// 单元格的通用样式
void cell_draw(lv_obj_draw_part_dsc_t* dsc, uint32_t row, uint32_t col, Style *style) {
    Common_Style *common_style = style->common_style;
    Table_Style *exclusive_style = style->exclusive_style;

    dsc->label_dsc->color = lv_color_hex(exclusive_style->row_font_color[row]);
    dsc->rect_dsc->bg_color = lv_color_hex(exclusive_style->row_background_color[row]);

    dsc->rect_dsc->outline_color = lv_color_hex(exclusive_style->outline_color);
    dsc->rect_dsc->outline_width = exclusive_style->outline_width;
}

// 被点击时的单元格样式,分为行选中、列选中和单元格选中
void cell_clicked_draw(lv_obj_draw_part_dsc_t* dsc, uint32_t row, uint32_t col, Table_Style *style) {
    switch (style->select_mode)
    {
    case 0:
        if (row == style->click_row)
            dsc->rect_dsc->bg_color = lv_color_hex(style->select_color);
        break;
    case 1:
        if (col == style->click_col)
            dsc->rect_dsc->bg_color = lv_color_hex(style->select_color);
        break;
    case 2:
        if (row == style->click_row && col == style->click_col)
            dsc->rect_dsc->bg_color = lv_color_hex(style->select_color);
        break;
    }
}

void table_draw(lv_obj_draw_part_dsc_t *dsc, Style *style){
    dsc->rect_dsc->bg_opa = 0;  // 隐藏最下层的白框
}

// 重绘事件监听函数
void tbl_draw_style_handler(lv_event_t *e) {
    lv_obj_t *widget = lv_event_get_target(e);
    lv_table_t *table = (lv_table_t *)widget;
    lv_obj_draw_part_dsc_t *dsc = lv_event_get_param(e);  // 获取结构体
    Style *style = lv_event_get_user_data(e);

    Common_Style *common_style = style->common_style;
    Table_Style *exclusive_style = style->exclusive_style;

    // 控制单元格样式
    if (dsc != NULL && dsc->part == LV_PART_ITEMS){
        uint32_t row = dsc->id /  lv_table_get_col_cnt(widget);
        uint32_t col = dsc->id - row * lv_table_get_col_cnt(widget);

        cell_draw(dsc, row, col, style);
        cell_clicked_draw(dsc, row, col, exclusive_style);
    }

    // 控制外框线和白底
    if (dsc != NULL && dsc->part == LV_PART_MAIN){
        table_draw(dsc, style);
    }

    // 控制行高
    for (size_t row = 0; row < exclusive_style->row_num; row++)
    {
        table->row_h[row] = exclusive_style->row_height;
    }
}

// 入口
lv_obj_t* add_table(Style *style){
    lv_obj_t *table;

    Common_Style *common_style = style->common_style;
    Table_Style *exclusive_style = style->exclusive_style;

    table = lv_table_create(lv_scr_act());
    
    // 整体样式,省略字体文字等代码
    lv_obj_set_x(table, common_style->h_ofs);
    lv_obj_set_y(table, common_style->v_ofs);

    // 表格样式
    lv_table_set_row_cnt(table, exclusive_style->row_num);
    lv_table_set_col_cnt(table, exclusive_style->col_num);
    for (size_t col = 0; col < exclusive_style->col_num; col++)
    {
        // 列宽
        lv_table_set_col_width(table, col, exclusive_style->col_width[col]);
    }

    // 重绘事件,控制单元格和行样式
    lv_obj_add_event_cb(table, tbl_draw_style_handler, LV_EVENT_DRAW_PART_BEGIN, style);
	// 表格的点击应该监听 LV_EVENT_VALUE_CHANGED 事件
    lv_obj_add_event_cb(table, tbl_clicked_style_handler, LV_EVENT_VALUE_CHANGED, style);

    return table;
}

因为是实际项目,使用了较为复杂的结构体进行样式的控制,style结构体定义如下,common_style和exclusicec_style的具体属性就不贴出来了,就是一些字符串和整型数值:

typedef struct Style {

    struct Common_Style *common_style;  // 通用样式

    void *exclusive_style;  // 控件专有样式

    lv_obj_t* widget;  // 控件对象

} Style;

具体步骤:

  1. 监听LV_EVENT_DRAW_PART_BEGIN事件。
  2. 在事件监听函数中获取lv_obj_draw_part_dsc_t结构体。
  3. 结构体属性赋值。

效果

在这里插入图片描述
去除了外框线和白底,自定义行高。
在这里插入图片描述

根据配置实现了点击行选中的颜色更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lvgl 自定义控制表格行高、颜色和外框样式 的相关文章

  • 深度学习03-卷积神经网络(CNN)

    简介 CNN 即卷积神经网络 Convolutional Neural Network 是一种常用于图像和视频处理的深度学习模型 与传统神经网络相比 CNN 有着更好的处理图像和序列数据的能力 因为它能够自动学习图像中的特征 并提取出最有用
  • Java RSA加密解密及签名验证

    一 简介 RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥 在公开密钥密码体制中 加密密钥 即公开密钥 PK是公开信息 而解密密钥 即秘密密钥 SK是需要保密的 加密算法E和解密算法D也都是公开的 虽然解密密钥SK是由公开密钥PK决
  • opengl的纹理过滤

    和纹理映射相关的另一个重要概念是 过滤 我们已经讨论了怎样将纹理坐标 这是个0到1之间的分数 映射到纹素上 纹理贴图中纹素的坐标总是以整数定义的 但是如果纹理坐标映射到纹素上的坐标为 152 34 745 14 怎么办 不明智的方案是将这个
  • css的三种引入方式

    目录 三种引入方式 1 行内样式 2 内部样式 内嵌式 3 外部样式 3 1外链式 3 2导入式 引入方式的优先级 三种引入方式 1 行内样式 行内样式就是直接把css样式添加在HTML标签中 作为style样式的属性值

随机推荐

  • DDR4 设计概述以及分析仿真案例(硬件学习)

    转载 DDR4 设计概述以及分析仿真案例 硬件设计讨论 EDA365电子论坛网 引言 随着计算机 服务器的性能需求越来越高 DDR4开始应用在一些高端设计中 然而目前关于DDR4的资料非常少 尤其是针对SI 信号完整性 部分以及相关中文资料
  • ODBC 各种数据库连接串

    Overview Generally one of the first steps when you are trying to work with databases is open it You can find several typ
  • 查看及配置交换机管理地址

    查看及配置交换机管理地址 问题 交换机是目前用于组建局域网的主要设备 交换机根据MAC地址表实现数据帧的转发 通过查看MAC地址表更加有利于交换机工作原理的理解 通过查看CISCO设备邻居信息来了解网络拓扑 通过telnet方式远程访问 配
  • Selenium+python之隐藏浏览器的“Chrome正在受到自动软件的控制“提示语

    在执行测试用例 细心的人都会发现 浏览器的title部分 有一句提示语 Chrome正在受到自动软件的控制 那么 能不能去掉这句提示语呢 也是没问题的 同样的 使用 headless 在浏览器中加入 disable infobars 这个参
  • pyecharts学习小总结——Bar(柱状图)、Pie(饼图)、Line(线图)、Page(页面组件)、Tab(分页组件)、Grid(组合组件)

    目录 pyecharts常用模块总结 Bar 柱状图 1 旋转x轴标签 2 添加工具箱 3 柱状图与折线图混合 4 标注x轴名称 5 设置垂直的一天时间线 6 旋转x和y轴 Pie 饼图 1 设置位置和半径大小 Line 线图 1 设置平滑
  • pip install scipy时发生zipfile.BadZipFile: File is not a zip file解决办法

    应该是下载时发生了丢包 我在官网下载时 只有14M 切换到豆瓣源有30M 附上地址 https pypi doubanio com simple scipy
  • java程序移植_java JDBC 提高程序可移植性

    介绍jdbc一般的程序 程序编程相关 jb oracle weblogic c 很多java初学者在开始接触jdbc编程的时候 在网上与大部分的教材上都是这样 推荐阅读 Java线程入门 什么是线程 import java sql 扩展信息
  • 预训练语言模型(PLMs)综述

    预训练语言模型 PLMs 内容来自AACL 2022 Tutorial https d223302 github io AACL2022 Pretrain Language Model Tutorial https d223302 gith
  • Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构

    前言 前面我们已经剖析了mysql中InnoDB与MyISAM索引的数据结构 了解了B 树的设计思想 原理 并且介绍了B 树与Hash结构 平衡二叉树 AVL树 B树等的区别和实际应用场景 页和页之间并不一定在物理上相连 只是在逻辑上使用双
  • java内存

    在java视频中 一直强调java内存的重要性 如果真正理解 了java内存的分配情况和程序运行时的java内存 那么你会对 java编程的思想 会更加深刻 Java内存分配与管理是Java的核心技术之一 Java的内存分配有三种 一 静态
  • 使用WPD API操作MTP设备一些总结

    使用WPD API操作MTP设备总结 本文分为两部分 1 WPD基本架构和概念的理解 2 使用WPD API操作MTP 拷贝 删除 设备 1 WPD基本架构和概念 1 1 WPD架构 原文 https docs microsoft com
  • Vue脚手架的安装配置以及使用

    安装Vue脚手架 1 需要安装nodejs支持 去nodejs官网下载对应版本的nodejs 可以使用installer 选择安装目录点击安装 也可以使用binary文件 直接选择文件夹解压缩 安装完成后如上图所示 然后配置环境变量 1 添
  • C++中指针和应用有哪些区别?

    a 指针是一个新的变量 存储了另一个变量的地址 我们可以通过访问这个地址来修改另一个变量 引用只是一个别名 还是变量本身 对引用的任何操作就是对变量本身进行操作 以达到修改变量的目的 b 引用只有一级 而指针可以有多级 c 指针传参的时候
  • show processlist 命令执行结果解释

    show full processlist show processlist 显示哪些线程正在运行 也可以通过 INFORMATION SCHEMA PROCESSLIST 表或 mysqladmin processlit 获取这些信息 如
  • 设计模式-状态模式(State)

    文章目录 前言 状态模式的核心概念 状态模式的用途 示例 状态模式的Java实现 状态模式优缺点 总结 前言 当我们需要在对象的生命周期中管理不同状态时 状态模式 State Pattern 是一种有用的设计模式 在这篇博客中 我们将介绍状
  • 免费的 PPT 模版资源

    1 第一 PPT 第一PPT站内资源以免费下载为基础 本着开放的共享为原则 服务于国内广大国内PPT爱好者 目前第一PPT站内的所有PowerPoint资源 PPT模板 PPT背景 PPT 素材 PPT教程 PPT软件 均是免费下载 所以请
  • openVPN服务端搭建

    搭建步骤 云服务器 Ubuntu 20 04 1 LTS 搭建服务端 公网IP 47 215 测试客户端 部门内部成员的windows10 或者windows11 及mac电脑 还有现场linux环境 最后目标是实现所有客户端之间能够互联
  • Electron桌面程序开发入门

    1 Electron结合vue项目配置 Electron是利用web前端技术进行桌面应用开发的一套框架 是由 github 开发的开源框架 允许开发者使用 Web 技术构建跨平台的桌面应用 它的基本结构 Electron Chromium
  • Vuluhub靶场-breach1

    网络设置和准备 该靶场的ip 192 168 110 140 我们要设置为仅主机模式 在虚拟机中将仅主机模式的ip地址范围包含靶机的ip 除了网络设置 还要准备两台kali 一台连接外网 一台和靶机一样要仅主机模式 信息收集 Nmap扫描
  • lvgl 自定义控制表格行高、颜色和外框样式

    lvgl 自定义控制表格行高 颜色和外框样式 lvgl版本 8 3 7 lvgl自带表格控件能够指定列宽 但是表格行高是根据内容动态渲染的 表格自带样式如图 带有蓝色的外框和白底 如果想要手动控制表格行高 颜色和外框等属性 需要监听表格绘制