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()
}
功能特点
- 提供现代化的GTK4界面组件
- 支持Adwaita设计语言
- 跨平台支持(Linux、Windows、macOS)
- 响应式布局
- 暗色/亮色主题支持
项目维护者
- 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();
}
代码说明
-
应用初始化:
- 创建libadwaita应用实例
- 设置应用ID(com.example.myapp)
-
主窗口创建:
- 使用ApplicationWindow构建器创建窗口
- 设置默认大小和标题
-
标题栏:
- 创建HeaderBar作为窗口标题栏
- 可以添加菜单按钮和其他控件
-
自适应页面:
- 使用AdaptivePage作为主容器
- 自动适应不同屏幕尺寸
-
操作行:
- 创建两个ActionRow示例
- 一个可点击的操作行
- 一个带Switch控件的操作行
-
主题切换:
- 通过Switch控件切换暗黑/明亮主题
- 使用StyleManager管理主题
-
对话框:
- 点击按钮显示MessageDialog
- 处理用户响应
-
响应式设计:
- 添加断点检测屏幕宽度变化
- 600px宽度时触发布局变化
这个完整示例展示了libadwaita的主要功能,包括窗口创建、常用组件、主题切换和响应式设计。你可以基于此示例进一步开发自己的应用。