593 字
2 分钟
Rust + eframe 学习
2026-04-19

从安装开始#

下载:https://www.rust-lang.org/zh-CN/tools/install

直接打开,按照默认即可。如果很慢就关掉,输入:

> $env:RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup"
> $env:RUSTUP_UPDATE_ROOT="https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup"

输入

> rustc --version

出现版本号就成功了。

Hello World#

创建一个程序:

> cargo new HelloWorld
> cd .\HelloWorld\

可以先安装下 GNU 工具链:

> rustup toolchain install stable-gnu
> rustup default stable-gnu

然后输入 cargo run 运行程序,程序会输出 Hello, world!

变量#

定义(要修改需要加上mut 标识符):

  • let a = 10; 赋值后不可修改
  • const PI: f64 = 3.14159; 常量

类型:i32,u64,i128,f64,bool,char

元组(固定长度不同类型):let sb = ("str" , 114 , 5.14);(取值用sb.0

数组(固定长度相同类型):let nums: [i32 ; 3] = [1 , 2 , 3];

函数#

fn f(n: i32) -> i32 { //函数体
if(n == 0) return 1;
return f(n - 1) * n;
}
fn add(a: i32 , b: i32) -> i32{ //表达式,返回 a + b
a + b
}

顺序/循环 结构#

  • if,没什么特别的,没有括号,其他和 c 一样。
  • loop 无限循环,用 break 退出。
  • while i < 3 { i += 1; }
  • for i in 1..4 { println!("for {}" , i); } 遍历 1~3

进阶#

速通完 rust,来尝试编写一个桌面应用程序吧!

eframe#

1. 窗口创建#

打开 Cargo.toml 添加依赖:eframe = "0.27"

然后来到 src/main.rs 在第一行导入库:use eframe::egui;

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions::default();
    eframe::run_native("My egui App", options, Box::new(|cc| Box::new(QWQ::new(cc))));
}

这里解释下 run_native

pub fn run_native(
title: &str,
native_options: NativeOptions,
app_creator: impl FnOnce(&CreationContext) -> Box<dyn App> + 'static,
) -> Result<(), Error>

native_options 表示窗口配置,比如窗口大小,是否全屏,图标等。代码里是默认值。

app_creator 是一个闭包函数(相当于匿名函数,| 参数 | 语句块/表达式),是用来给框架返回应用实例的。

然后该句没有分号,是表达式,作为 main 的返回值。

我们接着看剩下的代码:

#[derive(Default)]
struct QWQ {}
impl QWQ {
    fn new(cc: &eframe::CreationContext<'_>) -> Self {
        Self::default()
    }
}

其中,QWQ 是应用状态的结构体。

#[derive(Default)] 不是注释,形如 #[..] 的是 Rust 属性宏,可以给代码附加功能。这行可以自动实现一个 default 函数,会返回这个结构体的默认值,代码形如:

impl Default for QWQ { // 编译器自动帮你写的代码
fn default() -> Self { QWQ {} }
}

我们注意到有一个 impl ,这个是 implementation(实现)的缩写,开始给类型,结构体等添加方法函数的关键字。

接下来,实现 eframe 框架的核心,一定要实现 impl eframe::App for XXX 和函数 update

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

这里面, self 表示结构体,ctx 用来控制整个 UI,frame 是窗口本身,可以控制窗口关闭。

然后再在终端中输入 cargo run 就可以看到界面了。

2.#

可以改 options 来改变窗口配置:

let mut options = eframe::NativeOptions::default();
options.centered = true;

然后我们写出如下代码,比较简单不解释了:

use eframe::egui;
fn main() -> Result<(), eframe::Error> {
    let mut options = eframe::NativeOptions::default();
    options.centered = true;
    eframe::run_native("Tools", options, Box::new(|cc| Box::new(QWQ::new(cc))))
}
#[derive(Default)]
struct QWQ {
    nums: i32 ,
}
impl QWQ {
    fn new(cc: &eframe::CreationContext<'_>) -> Self {
        Self { nums : 0 }
    }
}
impl eframe::App for QWQ {
    fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.heading("Hello World!");
            ui.horizontal(|ui| {
                if ui.button("dark").clicked() {
                    ctx.set_visuals(egui::Visuals::dark());
                }
                if ui.button("light").clicked() {
                    ctx.set_visuals(egui::Visuals::light());
                }
            });
            ui.label(self.nums.to_string());
       });
       self.nums += 1;
   }
}

我们运行可以发现,显示的数字只有在鼠标等状态改变时才增加,所以 update 函数就是在这个时候被调用的。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

部分信息可能已经过时