【Godot4.2】CanvasItem绘图函数全解析 - 9.绘制表格

概述

之前介绍TextLineTextParagraph的时候,提到了用制表符和设定列宽形式来绘制简易表格,但是很明显,单纯使用此种方式很难获得对表格的精确控制。

所以对于表格绘制问题,我决定单独开坑,单独深入研究。

目前比较好的方式就是:

  • 将表格数据储存为一个二维数组
  • 设定列宽
  • 然后通过遍历每个单元格数据,来构造单独的TextLineTextParagraph实例,并通过列宽设定动态计算和绘制

系列目录

初期测试代码

以下为我初步测试的代码:

# =======================================================
# 使用绘图函数绘制表格 - 测试1
# 巽星石
# 202441218:30:24   Godot 4.2.1
# =======================================================
extends Node2D

var font = ThemeDB.fallback_font

var col_widths := [50,60,60,200]           # 列宽
var data = [
	["序号","姓名","性别","年龄"],
	["1","张三","男","32"],
	["2","李四","男","33"],
	["3","王五","男","34"],
	["4","巽星石","男","34000000000000000000"],
	["5","翼星石","男","34000000000000000000"],
	["6","羿星石","男","34000000000000000000"],
	["7","粪星石","男","34000000000000000000"],
	["8","龚星石","男","34000000000000000000"],
]

var line_height := 20.0                    # 行高
#var col_widths := [50,60,60,200]           # 列宽
var pos := Vector2(100,100)                # 绘制位置 - 表格左上角点
var bg_color:= Color.WHITE                 # 背景色
var th_bg_color:= Color.AQUAMARINE         # 表头背景色
var font_color:= Color.BLACK               # 字色
var border_color:= Color.DARK_GRAY         # 边框色
var padding := 5                           # 内边距

# 计算前几列的累计宽度
func cols_width(col:int):
	var w:float
	for i in range(col):
		w += col_widths[i] + padding * 2
	return w

func _ready() -> void:
	line_height += padding * 2


func _draw() -> void:
	var width = cols_width(col_widths.size())
	var height = line_height * data.size()
	# 背景矩形
	var rect = Rect2(pos,Vector2(width,height))
	draw_rect(rect,bg_color)
	# 表头矩形
	var rect2 = Rect2(pos,Vector2(width,line_height))
	draw_rect(rect2,th_bg_color)
	
	
	draw_line(pos,pos + Vector2(width,0),border_color,1)  # 顶部线
	for l in  range(data.size()): # 遍历数据行
		for i in range(data[l].size()): # 遍历数据列
			# 构造TextLine
			var text = TextLine.new()
			text.add_string(data[l][i],font,16)
			text.width = col_widths[i]
			text.alignment = HORIZONTAL_ALIGNMENT_CENTER
			# 绘制
			text.draw(get_canvas_item(),pos + Vector2(cols_width(i) + padding,(line_height) * l + padding),font_color)
			
		draw_line(pos+Vector2(0,line_height * (l+1)),pos + Vector2(cols_width(col_widths.size()),line_height * (l+1)),border_color,1)
	# 绘制竖线
	for i in range(col_widths.size()+1):
		var a1 = pos +Vector2(cols_width(i),0)
		var a2 = a1 + Vector2(0,line_height * data.size())
		draw_line(a1,a2,border_color,1)

绘制的效果:

image.png

可以看到已经实现了基本的内边距、单元格文本对齐设定以及整体的表格渲染功能。

后续展望

  • 后续将可能在目前工作的基础上编写表格绘制函数,并采用二维数组多行文本两种数据存储和解析形式
  • 将可能创建带有单元格合并以及斜线等特殊样式的表格
  • 可能会提供奇数、偶数行差异背景样式
  • 可能实现基于鼠标的交互,包括定位单行文本框控件LineEdit来编辑数据以及动态设定列宽
  • 在单元格中进行图文混排
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巽星石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值