Rust GTK4 UI库libadwaita-sys的使用,提供现代化GNOME应用程序开发接口

Rust GTK4 UI库libadwaita-sys的使用,提供现代化GNOME应用程序开发接口

安装

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

cargo add libadwaita-sys

或者在Cargo.toml中添加以下行:

libadwaita-sys = "0.8.0"

完整示例代码

下面是一个使用libadwaita-sys创建简单GNOME应用程序的完整示例:

use gtk::prelude::*;
use libadwaita_sys as adw;

fn main() {
    // 初始化GTK应用
    gtk::init().expect("Failed to initialize GTK");

    // 创建主窗口
    let window = gtk::ApplicationWindow::builder()
        .title("Libadwaita示例")
        .default_width(350)
        .default_height(70)
        .build();

    // 创建AdwApplicationWindow
    let adw_window = adw::ApplicationWindow::from_glib_full(window.to_glib_full());

    // 创建按钮
    let button = gtk::Button::with_label("点击我!");
    
    // 设置按钮点击事件
    button.connect_clicked(|_| {
        println!("按钮被点击!");
    });

    // 将按钮添加到窗口
    adw_window.set_child(Some(&button));

    // 显示窗口
    adw_window.show();

    // 运行主循环
    gtk::main();
}

功能特点

  1. 提供GNOME Adwaita UI组件绑定
  2. 支持现代化GNOME应用程序开发
  3. 与GTK4无缝集成
  4. 遵循GNOME人机界面指南

依赖关系

  • GTK4
  • libadwaita C库

许可证

MIT许可证

所有者

  • Jordan Petridis
  • Chris
  • Bilal Elmoussaoui
  • Maximiliano

分类

  • API绑定
  • GUI

扩展完整示例代码

下面是一个更完整的示例,展示如何使用libadwaita-sys创建一个带有标题栏和内容区域的GNOME应用程序:

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

fn main() {
    // 初始化GTK应用
    gtk::init().expect("Failed to initialize GTK");

    // 创建主窗口
    let window = gtk::ApplicationWindow::builder()
        .title("Libadwaita完整示例")
        .default_width(600)
        .default_height(400)
        .build();

    // 创建AdwApplicationWindow
    let adw_window = adw::ApplicationWindow::from_glib_full(window.to_glib_full());

    // 创建标题栏
    let header = gtk::HeaderBar::new();
    header.set_title(Some("Libadwaita应用"));
    header.set_show_title_buttons(true);

    // 创建主内容区域
    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 label = gtk::Label::new(Some("欢迎使用Libadwaita!"));

    // 创建按钮
    let button = gtk::Button::with_label("点击这里");
    button.connect_clicked(|_| {
        println!("按钮被点击了!");
    });

    // 将组件添加到内容区域
    content.append(&label);
    content.append(&button);

    // 设置窗口内容
    adw_window.set_titlebar(Some(&header));
    adw_window.set_child(Some(&content));

    // 显示窗口
    adw_window.show();

    // 运行主循环
    gtk::main();
}

1 回复

Rust GTK4 UI库libadwaita-sys的使用指南

概述

libadwaita-sys是Rust语言中用于开发现代化GNOME应用程序的低级绑定库,它提供了对GTK4和libadwaita库的原始FFI绑定。这个库特别适合需要与GNOME生态系统深度集成的应用程序开发。

主要特性

  • 提供GTK4和libadwaita的原始绑定
  • 支持GNOME HIG(人机界面指南)
  • 现代化的UI组件和设计语言
  • 深色/浅色主题支持
  • 响应式布局组件

安装方法

在Cargo.toml中添加依赖:

[dependencies]
libadwaita-sys = "0.4"

基本使用方法

1. 初始化应用

use libadwaita_sys as adw;
use gtk4_sys as gtk;
use glib_sys;

unsafe {
    // 初始化GTK
    gtk::gtk_init();
    
    // 创建主窗口
    let window = gtk::gtk_application_window_new(application);
    gtk::gtk_window_set_title(window, "My Adwaita App\0".as_ptr() as *const _);
    gtk::gtk_window_set_default_size(window, 800, 600);
    
    // 创建Adwaita应用窗口
    let adw_window = adw::adw_application_window_new(application);
    // ... 更多窗口设置
}

2. 使用Adwaita组件

unsafe {
    // 创建Adwaita标题栏
    let header = adw::adw_header_bar_new();
    gtk::gtk_window_set_titlebar(window, header);
    
    // 创建Adwaita按钮
    let button = gtk::gtk_button_new_with_label("Click me\0".as_ptr() as *const _);
    gtk::gtk_button_set_icon_name(button, "document-open-symbolic\0".as_ptr() as *const _);
    gtk::gtk_header_bar_pack_start(header, button);
}

3. 主题设置

unsafe {
    // 设置深色主题
    let style_manager = adw::adw_style_manager_get_default();
    adw::adw_style_manager_set_color_scheme(style_manager, adw::AdwColorScheme_ADW_COLOR_SCHEME_FORCE_DARK);
}

高级示例:创建带有标签页的窗口

unsafe {
    // 创建主窗口
    let window = adw::adw_application_window_new(application);
    
    // 创建标签页视图
    let tab_view = adw::adw_tab_view_new();
    
    // 添加几个标签页
    for i in 0..3 {
        let page = adw::adw_tab_page_new();
        let label = gtk::gtk_label_new(format!("Tab {}\0", i + 1).as_ptr() as *const _);
        adw::adw_tab_page_set_child(page, label);
        adw::adw_tab_view_append(tab_view, page);
    }
    
    // 将标签页视图添加到窗口
    gtk::gtk_window_set_child(window, tab_view);
    
    // 显示窗口
    gtk::gtk_widget_show(window);
}

完整示例代码

use libadwaita_sys as adw;
use gtk4_sys as gtk;
use glib_sys;

fn main() {
    unsafe {
        // 初始化GTK
        gtk::gtk_init();
        
        // 创建应用
        let app = gtk::gtk_application_new("org.example.myapp\0".as_ptr() as *const _, 
                                         glib_sys::G_APPLICATION_FLAGS_NONE);
        
        // 连接activate信号
        glib_sys::g_signal_connect_data(
            app as *mut _,
            "activate\0".as_ptr() as *const _,
            Some(on_activate as glib_sys::GCallback),
            std::ptr::null_mut(),
            None,
            0
        );
        
        // 运行应用
        glib_sys::g_application_run(app as *mut _, 0, std::ptr::null_mut());
        glib_sys::g_object_unref(app as *mut _);
    }
}

unsafe extern "C" fn on_activate(app: *mut glib_sys::GApplication, _user_data: glib_sys::gpointer) {
    // 创建主窗口
    let window = adw::adw_application_window_new(app as *mut _);
    gtk::gtk_window_set_title(window, "Adwaita Demo\0".as_ptr() as *const _);
    gtk::gtk_window_set_default_size(window, 800, 600);
    
    // 创建标签页视图
    let tab_view = adw::adw_tab_view_new();
    
    // 添加3个标签页
    for i in 0..3 {
        let page = adw::adw_tab_page_new();
        let label = gtk::gtk_label_new(format!("Tab {}\0", i + 1).as_ptr() as *const _);
        adw::adw_tab_page_set_child(page, label);
        adw::adw_tab_view_append(tab_view, page);
    }
    
    // 将标签页视图添加到窗口
    gtk::gtk_window_set_child(window, tab_view);
    
    // 显示窗口
    gtk::gtk_widget_show(window);
}

注意事项

  1. libadwaita-sys是低级绑定,大多数操作需要在unsafe块中进行
  2. 建议配合gtk-rs的高级绑定(如gtk4-rs)一起使用
  3. 字符串参数需要以null结尾(\0)
  4. 内存管理需要遵循GLib的规则

这个库适合需要深度集成GNOME桌面环境的应用程序开发,提供了符合GNOME设计语言的现代化UI组件。

回到顶部