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

rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十) 文件、文件夹选择框、保存文件框

一、Cargo.toml

[dependencies]
eframe = "0.32.1"
egui = "0.32.1"
rfd = "0.15.4"

二、框架代码

// 导入egui的窗口封装框架和核心库
use eframe::egui;
use rfd::FileDialog;
use std::sync::Arc;// 主函数使用Result返回错误类型,符合Rust错误处理最佳实践
fn main() -> eframe::Result<()> {// 自定义窗口尺寸let opt = eframe::NativeOptions {viewport: egui::ViewportBuilder::default().with_inner_size([400., 500.]),..Default::default()};eframe::run_native("打开文件", opt, Box::new(|_| Ok(Box::new(MyApp::new()))))
}struct MyApp {last_file_path: Option<String>, // 文件路径last_dir_path: Option<String>,  // 文件夹路径last_files_path: Vec<String>,   // 多文件选择时的多个路径列表save_file_path: Option<String>, // 保存文件路径
}impl MyApp {fn new() -> Self {Self {last_file_path: None,         // 文件路径初始化为空last_dir_path: None,          // 文件夹路径初始化为空last_files_path: Vec::new(),  // 多个文件列表初始化save_file_path: None,         // 保存文件路径初始化为空}}
}
impl eframe::App for MyApp {fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {eframe::egui::CentralPanel::default().show(ctx, |ui| {load_fonts(ctx);   // 设置字体,解决中文乱码问题,请查看以前文章// 以下所在相关代码所在位置…………});}
}

三、选择文件夹框.pick_folder()

  • .set_directory("e:\\"):初始化打开文件位置(可选)
 // 文件夹选择按钮
if ui.button("选择文件夹").clicked() {if let Some(path) = FileDialog::new().set_directory("e:\\").pick_folder() {self.last_dir_path = Some(path.display().to_string());}
}// 当选择后,显示选择的文件夹路径
if let Some(path) = &self.last_dir_path {   // 如果路径有值ui.label(format!("已选目录: {}", path));
}

四、选择单个文件框.pick_file()

  • .add_filter("文本文件", &["txt", "md"]) :定义一组所选择文件格式
if ui.button("选择单个文件").clicked() {if let Some(path) = FileDialog::new().add_filter("文本文件", &["txt", "md"]).add_filter("图像文件", &["png", "jpg", "jpeg"]).add_filter("所有文件", &["*"]).pick_file(){self.last_file_path = Some(path.display().to_string());}
}if let Some(path) = &self.last_file_path {    // 如果路径有值ui.label(format!("已选文件: {}", path));
}

五、选择多个文件框.pick_files()

if ui.button("选择多个文件").clicked() {if let Some(paths) = FileDialog::new().pick_files() {self.last_files_path = paths.iter().map(|p| p.display().to_string()).collect();  // 将路径列表转换为路径字符串列表}
}if !self.last_files_path.is_empty() {       // 如果列表不为空ui.label("已选文件:");for f in self.last_files_path.iter() {  // 遍历显示所有路径ui.label(f);}
}

六、保存文件框.save_file()

if ui.button("保存文件").clicked() {if let Some(path) = rfd::FileDialog::new().add_filter("text", &["txt", "rs"])              // 文件类型过滤.save_file(){self.save_file_path = Some(path.display().to_string());}
}if let Some(path) = &self.save_file_path {ui.label(format!("保存的文件路径:{}", path));
}
http://www.dtcms.com/a/349307.html

相关文章:

  • qt配置ros2环境,简单版本
  • Rust:变量、常量与数据类型
  • 2025 突出的时序模型
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day13
  • Linux-Redis的安装
  • 第四章:并发编程的基石与高级模式之Select语句与多路复用
  • 【Linux】开发工具命令指南:深度解析Vim的使用操作
  • Allegro17.4导出带有NET的PDF文档及组装样式图
  • MongoDB vs MySQL:NoSQL 和 SQL 的核心区别与适用场景
  • 前端开发:详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系
  • CPTS-Pressed复现(XML-RPC)
  • Python 面向对象进阶:深入理解封装、继承与多态
  • 【C++】第二十六节—C++11(中) | 右值引用和移动语义(续集)+lambda
  • 验证码流程
  • 【AMBA总线互联IP】
  • 6、RocketMQ消息积压问题如何解决
  • QSpinBox的用法及其使用QSS对其美化
  • 【ElasticSearch】json查询语法和可用的客户端
  • Docker 在线安装 RabbitMQ
  • 开源 C++ QT Widget 开发(五)通讯--串口调试
  • NILMTK(非侵入式负载监测工具包)安装
  • Linux 进阶之性能调优,文件管理,网络安全
  • AI精准种植改写农业格局:亩产量提升18%+水资源利用率提高32%,破解小农户技术门槛难题
  • Linux下usb设备驱动涉及的结构体
  • More Effective C++ 条款06: 区分自增自减操作符的前缀和后缀形式
  • 04-ArkTS编程语言入门
  • 分享些 Function 和 枚举的经典使用案例
  • 【RAGFlow代码详解-1】概述
  • 青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)
  • 同步阻塞和异步非阻塞是什么?