Rust GUI库egui/eframe初探入门(〇):生成第一个界面

egui是Rust原生的即时模式GUI图形库。
采用即时模式意味着每一帧重新绘制所有界面。也就是说在一般的静态布局界面的应用下,这种模式的性能开销是更大的。但是在一些界面变化较多较快的场景(例如一个简单的贪吃蛇小游戏),它的性能开销会小于使用保持模式的GUI应用。
按官方自己的说法,egui致力于构建快速、可用的GUI图形库,而非功能完善而强大的GUI库。
说白了,就是可以快速地开发一些小工具,而离生产环节应用还差距较远。
egui只是一个图形库,而不是图形界面开发框架。eframe是与egui配套使用的图形框架。


快速上手

首先使用cargo工具快速构建项目:cargo new YourProjectName
然后添加依赖:cargo add eframe
打开src/main.rc,编写第一个eframe示例程序。

use eframe::egui;

fn main() {
    let native_options = eframe::NativeOptions::default();
    eframe::run_native("My egui App", native_options, Box::new(|cc| Box::new(MyEguiApp::new(cc))));
}

#[derive(Default)]
struct MyEguiApp {}

impl MyEguiApp {
    fn new(cc: &eframe::CreationContext<'_>) -> Self {
        Self::default()
    }
}

impl eframe::App for MyEguiApp {
   fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
       egui::CentralPanel::default().show(ctx, |ui| {
           ui.heading("Hello World!");
       });
   }
}

使用cargo run编译并执行。
运行后可以看到界面
image

简单解析示例代码

我们从main()函数开始看。
其中的第一条语句let native_options = eframe::NativeOptions::default();声明了一个变量,作为后续生成桌面应用默认设置。Native表示我们将要编写的是桌面原生应用,egui/eframe同样支持WASM应用开发。

第二条语句eframe::run_native("My egui App", native_options, Box::new(|cc| Box::new(MyEguiApp::new(cc))));则是开始运行这个桌面应用。其中"My egui App"是这个应用的名字,其既作为应用程序的标题栏名字,也作为应用保存其退出状态的名称识别符(前提是打开了"persistence" feature)。native_options则是上一行代码生成的默认配置。Box::new(|cc| Box::new(MyEguiApp::new(cc)))是新建了一个MyEguiApp的结构体,以闭包传入参数cc(CreationContext),并以智能指针Box装箱。

MyEguiApp这个结构体当前是空的,后续实现我们自己的其它功能时会使用它存储数据。由于该结构体使用了#[derive(Default)]宏进行修饰,可以在其new函数中使用Self::default()返回一个该结构体的默认值。当然,由于目前结构体是空的,返回的也是一个空结构体。后续我们在向结构体中添加变量时需要是实现了Default trait的数据类型。否则我们就需要自行初始化全部变量。

fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame)这个函数则是在应用运行时,每帧运行一次进行实时更新。所有的界面布局在这一个函数当中实现。
其作为MyEguiApp这个结构体的impl函数,它的self则是调用它的这个MyEguiApp类型结构体。变量ctx是指Context,是调用egui的句柄。
在update函数中,我们使用 egui::CentralPanel::default().show()创建了一个CentralPanel并将其显示出来。其中以闭包的方式,在这个CentralPanel创建其它UI控件。目前我们只创建了一个heading用于显示Hello world!

结语

以上就是我们的第一个简单的egui/eframe界面程序。当前使用的eframe版本是eframe="0.24.1",后续egui/eframe版本的API或许会有所不同。

posted @ 2024-01-03 16:27  AbsalomT  阅读(3581)  评论(0编辑  收藏  举报