Rust图形界面:从零开始创建eGUi项目

文章目录

egui系列:初步

创建

首先,用cargo创建一个新项目,并添加eframe

rust 复制代码
cargo new hello
cd hello
cargo add eframe
cargo run

尽管默认创建的项目只实现了输出Hello world功能,但添加了eframe库,所以下载需要一点时间。

创建成功后,直接把下面的代码写入main.rs文件中,这些代码来自egui的hello_world示例。

rust 复制代码
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use eframe::egui;

struct MyApp {
    name: String,
    age: u32,
}

impl Default for MyApp {
    fn default() -> Self {
        Self {
            name: "Arthur".to_owned(),
            age: 42,
        }
    }
}

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.heading("self-introduction");
            ui.horizontal(|ui| {
                ui.label("name: ");
                ui.text_edit_singleline(&mut self.name);
            });
            ui.horizontal(|ui|{
                ui.add(egui::Slider::new(&mut self.age, 0..=120).text("age"));
                if ui.button("add one").clicked() {
                    self.age += 1;
                }
            });
        ui.label(format!("I'm {}, {} years old", self.name, self.age));
        });
    }
}

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions {
        initial_window_size: Some(egui::vec2(320.0, 160.0)),
        ..Default::default()
    };
    eframe::run_native(
        "self introduce",
        options,
        Box::new(|_cc| Box::<MyApp>::default()),
    )
}

然后运行cargo run,结果如下所示

组件

在eGUI初体验中,对其整体框架进行了说明,也大致讲解了每行语句的作用,但并没有十分确切地介绍eGUI中提供的函数的具体用法。

在这个小程序中,总共用到了5种控件,即下面5种

  • ui.heading 大文字
  • ui.label 标签
  • ui.text_edit_singleline 单行可编辑文本
  • ui.button 按钮
  • Slider 滚动条

主要来自两个结构体,分别是Ui和Widget。其中Ui里的组件以函数形式调用,Widget中的组件以结构体的形式调用。但大部分组件,二者之间可以互相转换。例如,在上面的代码中,通过调用ui.label("name: ");来创造一个标签,但也可以用另一种方法

rust 复制代码
ui.add(egui::Label::new("name: "));

但相比之下,直接用ui.label显然更加简洁。但是Slider并没有提供类似的简便的函数,所以只能用egui::Slider::new的方式创建。

show函数

eframe::App中,先是一层update函数,然后则是一层show函数,除了self之外,show有两个输入参数,分别是

  • ctx: &Context,
  • add_contents: impl FnOnce(&mut Ui) -> R

其中add_contents也是一个函数,换言之,show起到了一个回调函数的作用,其逻辑是,传给show一个ui参数,然后再add_contents中对ui进行设置,所以在添加组件时,要么直接调用ui.XXX,就算直接定义egui中的组件,也需要用ui.add将其添入其中。

相关推荐
superman超哥16 小时前
派生宏(Derive Macro)的工作原理:编译时元编程的艺术
开发语言·rust·开发工具·编程语言·rust派生宏·derive macro·rust元编程
superman超哥18 小时前
处理复杂数据结构:Serde 在实战中的深度应用
开发语言·rust·开发工具·编程语言·rust serde·rust数据结构
superman超哥18 小时前
错误处理与验证:Serde 中的类型安全与数据完整性
开发语言·rust·编程语言·rust编程·rust错误处理与验证·rust serde
禁默19 小时前
【鸿蒙PC命令行适配】rust应用交叉编译环境搭建和bat命令的移植实战指南
华为·rust·harmonyos
superman超哥19 小时前
自定义序列化逻辑:掌控数据编码的每一个细节
开发语言·rust·编程语言·rust自定义序列化·rust数据编码
superman超哥20 小时前
Serialize 与 Deserialize Trait:Rust 类型系统与序列化的完美融合
开发语言·rust·开发工具·编程语言·rust序列化·rust类型·serialize
沛沛rh4520 小时前
Rust浮点数完全指南:从基础到实战避坑
深度学习·算法·计算机视觉·rust
superman超哥21 小时前
Actix-web 性能优化技巧:从原理到实践
开发语言·rust·编程语言·actix-web
superman超哥21 小时前
Rust 与数据库连接池的集成:从理论到生产实践
开发语言·rust·编程语言·rust与数据库连接池的集成
superman超哥1 天前
序列化性能优化:从微秒到纳秒的极致追求
开发语言·rust·开发工具·编程语言·rust序列化性能优化·rust序列化