当前位置: 首页 > news >正文

【egui】官方示例 hello_world 完全解析

这是 egui 最简单的入门示例,展示了基本的 UI 控件:LabelTextEditSliderButton和图片显示。

📁 文件结构

hello_world/ ├── Cargo.toml # 项目依赖配置 ├── src/ │ └── main.rs # 主程序代码 └── screenshot.png # 运行截图

📦 Cargo.toml 详解

[package] name = "hello_world" # 项目名称 version = "0.1.0" # 版本号 authors = ["Emil Ernerfeldt <emil.ernerfeldt@gmail.com>"] # 作者(egui 作者) license = "MIT OR Apache-2.0" # 双许可证 edition = "2024" # Rust 2024 版次 rust-version = "1.92" # 最低 Rust 版本要求 publish = false # 不发布到 crates.io [lints] workspace = true # 继承工作区的 lint 配置 [dependencies] # eframe 主依赖,使用工作区配置,启用 __screenshot 功能用于截图 eframe = { workspace = true, features = [ "default", "__screenshot", # 可通过 EFRAME_SCREENSHOT_TO 环境变量输出截图 ] } # 图片支持扩展库 egui_extras = { workspace = true, features = ["default", "image"] } # 日志库,支持彩色输出和时间戳 env_logger = { workspace = true, features = ["auto-color", "humantime"] }

关键点解析

依赖作用
eframe应用框架,提供窗口、事件循环和渲染
eframe/__screenshot特殊功能,运行时设置EFRAME_SCREENSHOT_TO=path.png可保存截图
egui_extras扩展功能,这里启用image功能加载图片
env_logger日志输出,通过RUST_LOG=debug控制日志级别

🚀 main.rs 逐行解析

1. 文件头属性

#![cfg_attr(not(debug_assertions), windows_subsystem ="windows")]#![expect(rustdoc::missing_crate_level_docs)]
属性说明
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]发布模式(--release)下在 Windows 隐藏控制台窗口,只显示 GUI 窗口
#![expect(rustdoc::missing_crate_level_docs)]允许缺少 crate 级别文档(因为是示例)

2. 引入依赖

useeframe::egui;// 通过 eframe 重新导出使用 egui

3. main 函数

fnmain()->eframe::Result{// 初始化日志系统,可以通过 RUST_LOG=debug 查看详细日志env_logger::init();// 配置窗口选项letoptions=eframe::NativeOptions{// viewport 字段:设置窗口大小 320x240viewport:egui::ViewportBuilder::default().with_inner_size([320.0,240.0]),..Default::default()// 其余使用默认值};// 运行应用eframe::run_native("My egui App",// 窗口标题options,// 窗口配置Box::new(|cc|{// 应用创建闭包// 安装图片加载器,支持显示图片egui_extras::install_image_loaders(&cc.egui_ctx);// 返回默认的 MyApp 实例Ok(Box::<MyApp>::default())}),)}

4. 应用状态结构体

structMyApp{name:String,// 姓名age:u32,// 年龄}implDefaultforMyApp{fndefault()->Self{Self{name:"Arthur".to_owned(),// 默认姓名age:42,// 默认年龄}}}

5. 实现 eframe::App trait

impleframe::AppforMyApp{// ui 方法:每帧调用,绘制界面fnui(&mutself,ui:&mutegui::Ui,_frame:&muteframe::Frame){// 创建一个中央面板(带背景和边距)egui::CentralPanel::default().show_inside(ui,|ui|{// 大标题ui.heading("My egui Application");// 水平布局:标签 + 文本框ui.horizontal(|ui|{letname_label=ui.label("Your name: ");ui.text_edit_singleline(&mutself.name).labelled_by(name_label.id);// 关联标签,辅助功能});// 滑块控件,绑定 age,范围 0-120ui.add(egui::Slider::new(&mutself.age,0..=120).text("age"));// 按钮,点击时 age+1ifui.button("Increment").clicked(){self.age+=1;}// 显示当前值ui.label(format!("Hello '{}', age {}",self.name,self.age));// 显示图片(使用 include_image! 宏在编译时嵌入图片)ui.image(egui::include_image!("../../../crates/egui/assets/ferris.png"// 路径相对于 hello_world 示例));});}}

🎨 界面控件详解

1.Label(标签)

ui.label("Your name: ");ui.heading("My egui Application");// 大标题样式

2.TextEdit(文本编辑框)

ui.text_edit_singleline(&mutself.name)// 绑定到 String.labelled_by(name_label.id);// 关联标签 ID

3.Slider(滑块)

egui::Slider::new(&mutself.age,0..=120)// 绑定到 u32,范围 0-120.text("age")// 显示文本

4.Button(按钮)

ifui.button("Increment").clicked(){// 点击检测self.age+=1;}

5.Image(图片)

ui.image(egui::include_image!("path/to/image.png"));// include_image! 宏在编译时嵌入图片,无需运行时加载

🧠 关键概念理解

即时模式(Immediate Mode)

  • 每帧都重新构建 UI
  • 状态保存在MyApp结构体中
  • 控件通过返回值(如.clicked())响应用户操作

布局系统

  • CentralPanel:占据剩余空间,提供默认背景
  • horizontal:水平排列子控件
  • 嵌套布局:CentralPanel包含horizontal

数据绑定

  • 控件直接修改应用状态:&mut self.name&mut self.age
  • 无需手动更新 UI,框架自动重绘

图片处理

  • egui_extras::install_image_loaders初始化图片支持
  • include_image!宏在编译时嵌入图片,适合小图片
  • 图片路径相对于当前文件

🏃 运行方式

# 普通运行cargo run -p hello_world# 带日志调试运行RUST_LOG=debug cargo run -p hello_world# 生成截图(需要 __screenshot 功能)EFRAME_SCREENSHOT_TO=screenshot.png cargo run -p hello_world

📸 运行效果

界面包含:

  • 标题 “My egui Application”
  • “Your name:” 标签 + 文本输入框(默认 “Arthur”)
  • 年龄滑块(0-120,默认 42)
  • “Increment” 按钮,点击年龄+1
  • 显示 “Hello ‘姓名’, 年龄”
  • Ferris 螃蟹图片

💡 一句话总结

hello_world 示例展示了 egui 最核心的编程模式:状态存在结构体里,ui 方法每帧重新构建界面,控件直接读写状态,布局通过嵌套 Panel 和 horizontal 实现。

http://www.jsqmd.com/news/402610/

相关文章:

  • 基于BERT的中文智能客服系统实战:从模型微调到生产部署
  • 在WordPress中启用http2
  • 基于ESP32毕业设计的效率提升实战:从串口调试到OTA部署的全流程优化
  • 百联OK卡回收实用攻略:快速选正规平台,避坑不踩雷 - 可可收
  • python 描述符
  • Java求职面试场景:从Spring Boot到微服务的循序渐进技术解析
  • 运筹学-博弈论
  • 炸场实测!Qwen3.5-Plus硬刚GPT-5.2,开发者必看性能对比
  • AI辅助开发实战:解决cosyvoice安装失败的深度排查与修复指南
  • 2026国内二轮滚丝机厂家口碑排行,这些值得关注!二轮滚丝机 /滚丝机 /数控滚丝机/滚牙机 ,二轮滚丝机厂家推荐榜单 - 品牌推荐师
  • 苏宁易购通用卡怎么处理?正规回收流程一看就懂 - 可可收
  • 中微CMS32M5533电动工具方案 800W角磨机方案,单片机兼容CMS32M55xx CM...
  • Coqui TTS 实战:从零构建高效语音合成系统的避坑指南
  • NeoVim 报错: 配置中Tree-sitter缺失问题的解决方案
  • ComfyUI报错‘prompt outputs failed validation: checkpointloadersimple‘的深度解析与解决方案
  • 寝室管理系统毕业设计:基于微服务架构的效率提升实践
  • 从Copilot到Agent Native:2026年AI范式迁移与后端架构的深刻变革
  • 深入解析CosyVoice V3整合包:架构设计与性能优化实战
  • 吐血推荐!降AIGC网站 千笔 VS 灵感风暴AI,自考党必备神器
  • 【MyBatis+】@TableName
  • ChatTTS 本地一键部署实战指南:从环境配置到避坑技巧
  • 一文讲透|8个一键生成论文工具:专科生毕业论文+开题报告写作全测评
  • 计算机毕设开题报告实战指南:从选题到技术方案的工程化落地
  • 单片机指纹考勤系统毕业设计:从模块选型到低功耗架构的完整实现
  • Chatbot AI与GPT技术解析:从基础原理到生产环境实践
  • CodeBuddy提示词实战:如何构建高效可维护的AI对话系统
  • 基于Android毕业设计的实战指南:从选题到高可用架构落地
  • 【MyBatis Plus】@Service标签应该放在ServiceImpl上(接口不可以实例化)
  • 通信毕业设计选题偏软件?5个可落地的实战项目架构与实现指南
  • Vue3基于python的高校学生实习综合服务平台设计与实现(编号:58863393)