Rust UI开发库libadwaita的使用,GTK4现代界面框架libadwaita助力构建跨平台桌面应用

Rust UI开发库libadwaita的使用,GTK4现代界面框架libadwaita助力构建跨平台桌面应用

libadwaita-rs是libadwaita的Rust绑定库,用于构建现代GTK4桌面应用程序。

安装

在项目目录中运行以下Cargo命令:

cargo add libadwaita

或者在Cargo.toml中添加:

libadwaita = "0.8.0"

文档

  • libadwaita文档
  • libadwaita-sys文档

完整示例代码

下面是一个使用libadwaita创建简单窗口的完整示例:

use libadwaita as adw;
use gtk::{glib, prelude::*};

fn main() -> glib::ExitCode {
    // 初始化应用
    let app = adw::Application::new(
        Some("com.example.myapp"),
        Default::default()
    );
    
    // 连接activate信号
    app.connect_activate(|app| {
        // 创建主窗口
        let window = adw::ApplicationWindow::builder()
            .application(app)
            .default_width(400)
            .default_height(300)
            .title("My Libadwaita App")
            .build();
        
        // 创建标题栏
        let header = adw::HeaderBar::new();
        
        // 创建内容区域
        let content = gtk::Box::new(gtk::Orientation::Vertical, 12);
        content.set_margin_top(12);
        content.set_margin_bottom(12);
        content.set_margin_start(12);
        content.set_margin_end(12);
        
        // 添加欢迎文本
        let welcome = adw::WindowTitle::new("Welcome", "This is a libadwaita app");
        content.append(&welcome);
        
        // 添加按钮
        let button = gtk::Button::with_label("Click me!");
        button.connect_clicked(|_| {
            println!("Button clicked!");
        });
        content.append(&button);
        
        // 组装窗口
        let main_box = gtk::Box::new(gtk::Orientation::Vertical, 0);
        main_box.append(&header);
        main_box.append(&content);
        
        window.set_content(Some(&main_box));
        window.present();
    });
    
    // 运行应用
    app.run()
}

功能特点

  1. 提供现代化的GTK4界面组件
  2. 支持Adwaita设计语言
  3. 跨平台支持(Linux、Windows、macOS)
  4. 响应式布局
  5. 暗色/亮色主题支持

项目维护者

  • Jordan Petridis
  • Chris
  • Bilal Elmoussaoui
  • Maximiliano

许可证

MIT许可证

完整示例demo

以下是一个更完整的libadwaita应用示例,展示了更多UI组件和功能:

use libadwaita as adw;
use gtk::{glib, prelude::*};

fn main() -> glib::ExitCode {
    // 初始化应用
    let app = adw::Application::new(
        Some("com.example.myapp"),
        Default::default()
    );
    
    app.connect_activate(|app| {
        // 创建主窗口
        let window = adw::ApplicationWindow::builder()
            .application(app)
            .default_width(600)
            .default_height(400)
            .title("Libadwaita Demo")
            .build();
        
        // 创建标题栏
        let header = adw::HeaderBar::new();
        
        // 创建内容区域
        let content = gtk::Box::new(gtk::Orientation::Vertical, 12);
        content.set_margin_top(12);
        content.set_margin_bottom(12);
        content.set_margin_start(12);
        content.set_margin_end(12);
        
        // 添加欢迎标题
        let title = adw::WindowTitle::new("Libadwaita Demo", "展示各种UI组件");
        content.append(&title);
        
        // 创建标签页视图
        let tab_view = adw::TabView::new();
        
        // 第一页:按钮示例
        let button_page = adw::TabPage::new();
        button_page.set_title("Buttons");
        
        let button_box = gtk::Box::new(gtk::Orientation::Vertical, 6);
        
        // 普通按钮
        let normal_button = gtk::Button::with_label("Normal Button");
        normal_button.connect_clicked(|_| {
            println!("Normal button clicked");
        });
        button_box.append(&normal_button);
        
        // 带图标的按钮
        let icon_button = gtk::Button::from_icon_name("document-open");
        icon_button.set_label("Open");
        button_box.append(&icon_button);
        
        button_page.set_child(Some(&button_box));
        tab_view.append(&button_page);
        
        // 第二页:输入控件
        let input_page = adw::TabPage::new();
        input_page.set_title("Inputs");
        
        let input_box = gtk::Box::new(gtk::Orientation::Vertical, 6);
        
        // 文本输入框
        let entry = gtk::Entry::new();
        entry.set_placeholder_text("Enter text here");
        input_box.append(&entry);
        
        // 开关控件
        let switch = gtk::Switch::new();
        let switch_row = adw::ActionRow::new();
        switch_row.set_title("Enable Feature");
        switch_row.add_suffix(&switch);
        input_box.append(&switch_row);
        
        input_page.set_child(Some(&input_box));
        tab_view.append(&input_page);
        
        // 将标签页视图添加到内容区域
        content.append(&tab_view);
        
        // 组装窗口
        let main_box = gtk::Box::new(gtk::Orientation::Vertical, 0);
        main_box.append(&header);
        main_box.append(&content);
        
        window.set_content(Some(&main_box));
        window.present();
    });
    
    app.run()
}

1 回复

Rust UI开发库libadwaita使用指南

libadwaita简介

libadwaita是GTK4的一个现代UI组件库,专为构建符合GNOME人机界面指南(HIG)的应用程序而设计。它为Rust开发者提供了一套美观、现代的UI组件,特别适合开发Linux桌面应用,同时也支持跨平台开发。

主要特性

  • 符合GNOME设计语言的现代UI组件
  • 自适应布局,支持不同屏幕尺寸
  • 内置暗黑/明亮主题支持
  • 流畅的动画和过渡效果
  • 与GTK4紧密集成

基本使用方法

1. 添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
gtk = { version = "0.6", features = ["v4_6"] }
libadwaita = "0.4"

2. 初始化应用

use gtk::prelude::*;
use libadwaita::prelude::*;

fn main() {
    let app = libadwaita::Application::new(
        Some("com.example.myapp"),
        Default::default(),
    );
    
    app.connect_activate(|app| {
        // 创建主窗口
        let window = libadwaita::ApplicationWindow::builder()
            .application(app)
            .default_width(800)
            .default_height(600)
            .title("My Libadwaita App")
            .build();
        
        // 添加内容
        let header = libadwaita::HeaderBar::new();
        window.set_titlebar(Some(&header));
        
        let content = gtk::Box::new(gtk::Orientation::Vertical, 12);
        window.set_content(Some(&content));
        
        // 显示窗口
        window.present();
    });
    
    app.run();
}

完整示例代码

下面是一个完整的libadwaita应用示例,整合了多个常用组件:

use gtk::prelude::*;
use libadwaita::prelude::*;

fn main() {
    // 创建应用
    let app = libadwaita::Application::new(
        Some("com.example.myapp"),
        Default::default(),
    );
    
    app.connect_activate(|app| {
        // 创建主窗口
        let window = libadwaita::ApplicationWindow::builder()
            .application(app)
            .default_width(800)
            .default_height(600)
            .title("Libadwaita Demo")
            .build();
        
        // 创建标题栏
        let header = libadwaita::HeaderBar::new();
        window.set_titlebar(Some(&header));
        
        // 创建自适应页面
        let page = libadwaita::AdaptivePage::new();
        page.set_title("Demo Application");
        
        // 创建垂直布局容器
        let content = gtk::Box::new(gtk::Orientation::Vertical, 12);
        content.set_margin_top(12);
        content.set_margin_bottom(12);
        content.set_margin_start(12);
        content.set_margin_end(12);
        
        // 添加操作行1
        let row1 = libadwaita::ActionRow::builder()
            .title("Wi-Fi设置")
            .subtitle("当前连接: Home-WiFi")
            .activatable(true)
            .build();
        
        row1.connect_activated(|_| {
            println!("Wi-Fi设置被点击");
        });
        
        // 添加操作行2带开关
        let switch = libadwaita::Switch::new();
        let row2 = libadwaita::ActionRow::builder()
            .title("暗黑模式")
            .activatable_widget(&switch)
            .build();
        
        switch.connect_state_set(|_, state| {
            let manager = libadwaita::StyleManager::default();
            if state {
                manager.set_color_scheme(libadwaita::ColorScheme::PreferDark);
            } else {
                manager.set_color_scheme(libadwaita::ColorScheme::PreferLight);
            }
            gtk::Inhibit(false)
        });
        
        // 创建列表容器
        let list = libadwaita::ListBox::new();
        list.append(&row1);
        list.append(&row2);
        
        // 添加按钮
        let button = gtk::Button::with_label("显示对话框");
        button.connect_clicked(move |_| {
            let dialog = libadwaita::MessageDialog::builder()
                .transient_for(&window)
                .heading("确认操作")
                .body("确定要执行此操作吗?")
                .build();
            
            dialog.add_response("cancel", "取消");
            dialog.add_response("confirm", "确认");
            
            dialog.connect_response(Some("confirm"), |_| {
                println!("用户确认了操作");
            });
            
            dialog.present();
        });
        
        // 将所有组件添加到内容区域
        content.append(&list);
        content.append(&button);
        page.set_content(&content);
        window.set_content(Some(&page));
        
        // 添加响应式断点
        let breakpoint = libadwaita::Breakpoint::new();
        breakpoint.set_condition(libadwaita::BreakpointCondition::max_width(600));
        
        breakpoint.connect_apply(|_| {
            println!("小屏幕布局激活");
        });
        
        breakpoint.connect_unapply(|_| {
            println!("大屏幕布局恢复");
        });
        
        window.add_breakpoint(&breakpoint);
        
        // 显示窗口
        window.present();
    });
    
    app.run();
}

代码说明

  1. 应用初始化:

    • 创建libadwaita应用实例
    • 设置应用ID(com.example.myapp)
  2. 主窗口创建:

    • 使用ApplicationWindow构建器创建窗口
    • 设置默认大小和标题
  3. 标题栏:

    • 创建HeaderBar作为窗口标题栏
    • 可以添加菜单按钮和其他控件
  4. 自适应页面:

    • 使用AdaptivePage作为主容器
    • 自动适应不同屏幕尺寸
  5. 操作行:

    • 创建两个ActionRow示例
    • 一个可点击的操作行
    • 一个带Switch控件的操作行
  6. 主题切换:

    • 通过Switch控件切换暗黑/明亮主题
    • 使用StyleManager管理主题
  7. 对话框:

    • 点击按钮显示MessageDialog
    • 处理用户响应
  8. 响应式设计:

    • 添加断点检测屏幕宽度变化
    • 600px宽度时触发布局变化

这个完整示例展示了libadwaita的主要功能,包括窗口创建、常用组件、主题切换和响应式设计。你可以基于此示例进一步开发自己的应用。

回到顶部