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();
}
功能特点
- 提供GNOME Adwaita UI组件绑定
- 支持现代化GNOME应用程序开发
- 与GTK4无缝集成
- 遵循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);
}
注意事项
- libadwaita-sys是低级绑定,大多数操作需要在unsafe块中进行
- 建议配合gtk-rs的高级绑定(如gtk4-rs)一起使用
- 字符串参数需要以null结尾(\0)
- 内存管理需要遵循GLib的规则
这个库适合需要深度集成GNOME桌面环境的应用程序开发,提供了符合GNOME设计语言的现代化UI组件。