Rust有哪些好用的界面库推荐

最近在学习Rust开发桌面应用,想请教各位有没有推荐的界面库?目前了解到有GTK、Iced、Tauri这些选择,但不太清楚它们的优缺点和适用场景。希望能推荐一些成熟稳定、社区支持好的库,最好是能跨平台的,同时想了解下学习曲线和性能表现如何?谢谢!

2 回复

推荐几个常用的Rust界面库:

  • egui:轻量级即时模式GUI,适合工具类应用。
  • Druid:数据驱动的原生GUI框架,设计现代。
  • Iced:受Elm启发的跨平台库,简洁易用。
  • Slint:性能优秀,支持多平台,商业友好。
  • Tauri:结合Web前端技术,适合桌面应用开发。

根据需求选择,egui和Iced社区活跃,适合快速上手。


Rust 的 GUI 生态正在快速发展,以下是几个主流且好用的界面库推荐:

1. egui

  • 特点:即时模式 GUI,轻量级,纯 Rust 实现,适合工具类应用和游戏内界面。
  • 适用场景:嵌入式界面、简单工具、实时渲染应用。
  • 代码示例
    use eframe::egui;
    
    fn main() -> Result<(), eframe::Error> {
        let options = eframe::NativeOptions::default();
        eframe::run_native(
            "egui示例",
            options,
            Box::new(|_cc| Box::new(MyApp::default())),
        )
    }
    
    #[derive(Default)]
    struct MyApp;
    
    impl eframe::App for MyApp {
        fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
            egui::CentralPanel::default().show(ctx, |ui| {
                ui.heading("Hello egui!");
                if ui.button("点击我").clicked() {
                    println!("按钮被点击!");
                }
            });
        }
    }
    

2. Iced

  • 特点:受 Elm 架构启发,跨平台,专注于简洁性和类型安全。
  • 适用场景:桌面应用、跨平台项目。
  • 代码示例
    use iced::{button, Button, Column, Text};
    
    #[derive(Default)]
    struct Counter {
        value: i32,
        increment_button: button::State,
    }
    
    impl iced::Application for Counter {
        type Message = Message;
    
        fn new() -> (Self, iced::Command<Self::Message>) {
            (Self::default(), iced::Command::none())
        }
    
        fn update(&mut self, message: Self::Message) -> iced::Command<Self::Message> {
            match message {
                Message::Increment => self.value += 1,
            }
            iced::Command::none()
        }
    
        fn view(&mut self) -> iced::Element<'_, Self::Message> {
            Column::new()
                .push(Text::new(format!("计数: {}", self.value)))
                .push(Button::new(&mut self.increment_button, Text::new("+1")).on_press(Message::Increment))
                .into()
        }
    }
    
    #[derive(Debug, Clone)]
    enum Message {
        Increment,
    }
    

3. Druid

  • 特点:数据驱动,受现代 GUI 框架启发,功能丰富。
  • 适用场景:复杂桌面应用。
  • 代码示例
    use druid::{AppLauncher, Widget, WindowDesc};
    use druid::widget::{Label, Button, Flex};
    
    fn main() {
        let main_window = WindowDesc::new(ui_builder);
        AppLauncher::with_window(main_window)
            .launch(0u32)
            .expect("启动失败");
    }
    
    fn ui_builder() -> impl Widget<u32> {
        let label = Label::new(|data: &u32, _env: &_| format!("计数: {}", data));
        let button = Button::new("+1")
            .on_click(|_ctx, data, _env| *data += 1);
    
        Flex::column().with_child(label).with_child(button)
    }
    

4. Slint(原名 SixtyFPS)

  • 特点:声明式 UI,支持多种后端,性能优秀。
  • 适用场景:嵌入式、桌面和移动端。
  • 代码示例(基于 .slint 文件):
    // main.slint
    MainWindow := Window {
        property<int> counter: 0;
        VerticalLayout {
            Text { text: "计数: " + counter; }
            Button {
                text: "+1";
                clicked => { counter += 1; }
            }
        }
    }
    
    Rust 代码:
    slint::include_modules!();
    fn main() {
        let window = MainWindow::new();
        window.run();
    }
    

5. Tauri(结合 Web 技术)

  • 特点:使用 Web 前端(HTML/CSS/JS)构建界面,Rust 处理后端逻辑,安全性高。
  • 适用场景:跨平台桌面应用,尤其适合 Web 开发者。

选择建议:

  • 简单工具/游戏界面:优先选 egui
  • 跨平台桌面应用IcedSlint
  • 复杂数据驱动应用Druid
  • Web 技术栈迁移Tauri

这些库均在活跃开发中,建议根据项目需求、团队熟悉度和性能要求进行选择。

回到顶部