说在前面
- rust新手,egui没啥找到啥教程,这里自己记录下学习过程
- 环境:windows11 22H2
- rust版本:rustc 1.71.1
- egui版本:0.22.0
- eframe版本:0.22.0
- 上一篇:这里
开始
-
首先让我们看看
main.rs
中有些什么rust#![warn(clippy::all, rust_2018_idioms)] #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // 在release模式中隐藏控制台窗口(实际上我怎么试也没找到这个窗口) 本文放弃关注 // 非wasm架构 #[cfg(not(target_arch = "wasm32"))] fn main() -> eframe::Result<()> { env_logger::init(); // 初始化log参数,debug模式下仅会打印error日志 let native_options = eframe::NativeOptions::default(); // 初始化eframe默认参数 eframe::run_native( "demo app", native_options, Box::new(|cc| Box::new(demo_app::TemplateApp::new(cc))), ) // 启动eframe } // When compiling to web using trunk: #[cfg(target_arch = "wasm32")] // ... 本文暂不关注wasm相关内容
日志输出
-
在
eframe
中使用的日志库为log
以及env_logger
,其日志等级有5个:rustpub enum Level { Error, Warn, Info, Debug, Trace, }
-
我们可以在main函数中添加测试一下:
rustfn main() -> eframe::Result<()> { env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). log::info!("1"); log::warn!("2"); log::error!("3"); log::trace!("4"); log::debug!("5"); // ... }
-
执行
cargo run
,只能看到error
输出;使用cargo run --release
的话什么日志都没有了shell[2023-08-13T09:20:59Z ERROR demo_app] 3
-
env_logger
可以指定日志输出的级别以及目标,当我们在cmd
下执行(注意powershell
的设置环境变量的语法不一样):shellset RUST_LOG=demo_app cargo run
这会将我们的项目(demo_app)下所有的级别的log进行输出,现在我们能看到所有级别的日志了
shell[2023-08-13T09:27:18Z INFO demo_app] 1 [2023-08-13T09:27:18Z WARN demo_app] 2 [2023-08-13T09:27:18Z ERROR demo_app] 3 [2023-08-13T09:27:18Z TRACE demo_app] 4 [2023-08-13T09:27:18Z DEBUG demo_app] 5
-
现在我们尝试下将
eframe
的日志都输出:shellset RUST_LOG=eframe cargo run
可以看到大量的日志输出:
shell[2023-08-13T09:31:29Z DEBUG eframe] Using the glow renderer [2023-08-13T09:31:29Z DEBUG eframe::native::run] Entering the winit event loop (run_return)...
eframe初始化参数
-
在main函数中调用
eframe::run_native()
时使用到了一个native_options
,让我们看看这里面有些什么:shellalways_on_top: bool Sets whether or not the window will always be on top of other windows at initialization. maximized: bool Show window in maximized mode decorated: bool On desktop: add window decorations (i.e. a frame around your app)? If false it will be difficult to move and resize the app. fullscreen: bool Start in (borderless) fullscreen? ...
-
我们可以试着改几个看看效果
-
always_on_top
rustlet mut native_options = eframe::NativeOptions::default(); native_options.always_on_top = true;
-
decorated
rustlet mut native_options = eframe::NativeOptions::default(); native_options.always_on_top = true; native_options.decorated = false;
毫无灵魂了,甚至和背景融为一体了 -
transparent
rustlet mut native_options = eframe::NativeOptions::default(); native_options.transparent = true; // 同时注释掉app.rs中 egui::CentralPanel::default() 代码
-
-
其他详细参数见这里,大家可以自己试试
eframe::run_native
-
调用该函数创建我们的应用窗口,其定义为:
rustpub fn run_native( app_name: &str, // 应用名 native_options: NativeOptions, // 初始化选项 app_creator: AppCreator // 应用主逻辑 ) -> Result<()>
-
app_name
应用名称,在我们的例子中为demo app
;同时该值也是我们的窗口显示的名称,同时也是持久化存储(下一节看看 )目录的名称;