如何在Egui中创建可调整列宽的表格?报错求可运行示例代码
解决egui_extras表格列宽调整问题及示例代码
先解决你遇到的类型不匹配错误
- 确保
egui和egui_extras在Cargo.toml中的版本完全一致,比如都使用0.22.0(可根据当前稳定版调整) - 避免导入冲突,统一使用
use egui::Ui;,不要从其他路径导入同名的Ui类型
可运行的列宽可调表格示例代码
基于egui 0.22.0和egui_extras 0.22.0编写,支持Excel风格的列宽拖拽调整:
use eframe::egui; use egui_extras::{Column, TableBuilder}; fn main() -> Result<(), eframe::Error> { eframe::run_native( "可调整列宽的Egui表格", eframe::NativeOptions::default(), Box::new(|_cc| Box::new(MyApp::default())), ) } #[derive(Default)] struct MyApp { // 持久化存储列宽,避免窗口刷新后重置 column_widths: [f32; 3], } impl eframe::App for MyApp { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { egui::CentralPanel::default().show(ctx, |ui| { ui.heading("Excel风格可调整列宽表格"); TableBuilder::new(ui) .column(Column::auto().initial_width(self.column_widths[0])) .column(Column::auto().initial_width(self.column_widths[1])) .column(Column::auto().initial_width(self.column_widths[2])) .resizable(true) // 启用列宽拖拽功能 .header(20.0, |mut header| { header.col(|ui| { ui.label("姓名"); }); header.col(|ui| { ui.label("年龄"); }); header.col(|ui| { ui.label("邮箱"); }); }) .body(|mut body| { // 示例数据行 for i in 0..5 { body.row(20.0, |mut row| { row.col(|ui| { ui.label(format!("用户{}", i)); }); row.col(|ui| { ui.label(format!("{}", 20 + i)); }); row.col(|ui| { ui.label(format!("user{}@example.com", i)); }); }); } }); // 保存用户调整后的列宽 if let Some(table) = ui.widgets::<egui_extras::TableState>().last() { for (i, width) in table.column_widths.iter().enumerate() { if i < self.column_widths.len() { self.column_widths[i] = *width; } } } }); } }
关键说明
resizable(true)是开启列宽拖拽的核心配置column_widths数组用于持久化列宽,保证调整后的数据不会丢失Column::auto()让列默认自适应内容,同时支持手动拖拽调整
依赖配置(Cargo.toml)
务必保证版本一致:
[dependencies] eframe = "0.22.0" egui = "0.22.0" egui_extras = "0.22.0"
内容的提问来源于stack exchange,提问作者zackhary
相关产品推荐
相关产品推荐

