Rust GUI开发库fltk-derive的使用:简化FLTK绑定与自定义控件生成的Rust过程宏库
Rust GUI开发库fltk-derive的使用:简化FLTK绑定与自定义控件生成的Rust过程宏库
安装
在项目目录中运行以下Cargo命令:
cargo add fltk-derive
或者在Cargo.toml中添加以下行:
fltk-derive = "1.2.5"
元数据
- 版本:1.2.5
- 发布时间:约4年前(2018版)
- 许可证:MIT
- 大小:19.4 KiB
- 所有者:Mohammed Alyousef (MoAlyousef)
文档
完整示例代码
以下是一个使用fltk-derive创建自定义控件的完整示例:
use fltk::{app, button::Button, frame::Frame, group::Group, prelude::*};
use fltk_derive::{widget, WidgetBase, WidgetExt, WidgetType};
// 定义自定义控件
#[widget]
#[derive(WidgetBase, WidgetExt, WidgetType)]
pub struct CustomButton {
// 继承自Group
#[inherit]
g: Group,
// 子控件
btn: Button,
frame: Frame,
}
impl CustomButton {
pub fn new(x: i32, y: i32, w: i32, h: i32, label: &str) -> Self {
// 创建自定义控件
let mut cb = CustomButton::default()
.with_size(w, h)
.with_pos(x, y)
.with_label(label);
// 设置子控件
cb.btn.set_label("Click me!");
cb.frame.set_label("Status: Ready");
// 添加回调
cb.btn.set_callback({
let mut frame = cb.frame.clone();
move |_| frame.set_label("Status: Clicked!")
});
cb
}
}
fn main() {
let app = app::App::default();
let mut win = fltk::window::Window::new(100, 100, 400, 300, "Custom Button Example");
// 使用自定义控件
let _btn = CustomButton::new(50, 50, 300, 200, "My Custom Button");
win.end();
win.show();
app.run().unwrap();
}
这个示例展示了如何使用fltk-derive的过程宏来创建自定义控件:
- 使用
#[widget]
属性宏定义自定义控件 - 通过派生
WidgetBase
、WidgetExt
和WidgetType
来获得基本功能 - 使用
#[inherit]
属性继承现有控件类型 - 定义子控件作为结构体成员
- 实现自定义方法和行为
该库简化了FLTK绑定的使用,使创建自定义GUI组件变得更加简单。
1 回复
Rust GUI开发库fltk-derive使用指南
完整示例代码
下面是一个结合了基本控件、自定义控件和组合控件的完整示例:
use fltk::{app, enums::Color, prelude::*, window::Window, button::Button, input::Input, group::Flex};
use fltk_derive::{WidgetBase, WidgetExt, GroupExt};
// 自定义按钮控件
#[derive(Debug, Clone, WidgetBase, WidgetExt)]
struct CounterButton {
inner: Button,
count: i32,
}
impl CounterButton {
pub fn new(x: i32, y: i32, w: i32, h: i32, label: &str) -> Self {
let mut btn = Button::new(x, y, w, h, label);
btn.set_color(Color::from_rgb(100, 149, 237)); // 设置按钮颜色
Self {
inner: btn,
count: 0,
}
}
pub fn increment(&mut self) -> i32 {
self.count += 1;
self.inner.set_label(&format!("Clicked {} times", self.count));
self.count
}
}
// 登录表单组合控件
#[derive(WidgetBase, WidgetExt, GroupExt)]
struct LoginPanel {
inner: Flex,
username: Input,
password: Input,
login_btn: Button,
counter_btn: CounterButton,
}
impl LoginPanel {
pub fn new(x: i32, y: i32, w: i32, h: i32) -> Self {
let mut flex = Flex::new(x, y, w, h, None).column();
let username = Input::new(0, 0, 0, 0, "用户名:");
let password = Input::new(0, 0, 0, 0, "密码:");
let mut login_btn = Button::new(0, 0, 0, 0, "登录");
let counter_btn = CounterButton::new(0, 0, 0, 0, "点击计数");
flex.end();
Self {
inner: flex,
username,
password,
login_btn,
counter_btn,
}
}
}
fn main() {
let app = app::App::default();
let mut wind = Window::new(100, 100, 400, 400, "FLTK-Derive综合示例");
// 创建登录面板
let mut panel = LoginPanel::new(50, 50, 300, 300);
// 设置登录按钮回调
panel.login_btn.set_callback({
let mut panel = panel.clone();
move |_| {
println!(
"登录尝试 - 用户名: {}, 密码: {}",
panel.username.value(),
panel.password.value()
);
}
});
// 设置计数按钮回调
panel.counter_btn.set_callback({
let mut panel = panel.clone();
move |b| {
let count = b.increment();
println!("按钮已被点击{}次", count);
}
});
wind.end();
wind.show();
app.run().unwrap();
}
代码说明
-
自定义控件CounterButton:
- 继承自FLTK的Button控件
- 添加了点击计数功能
- 使用derive宏自动实现了WidgetBase和WidgetExt trait
-
组合控件LoginPanel:
- 使用Flex布局管理器
- 包含用户名/密码输入框和两个按钮
- 使用derive宏自动实现了WidgetBase、WidgetExt和GroupExt trait
-
回调处理:
- 展示了闭包中如何使用克隆的控件引用
- 登录按钮处理表单提交
- 计数按钮记录点击次数并更新标签
-
样式设置:
- 自定义按钮设置了特殊的背景颜色
- 使用Flex布局自动调整控件大小和位置
这个示例展示了fltk-derive库的主要功能,包括自定义控件、组合控件和回调处理,是使用该库开发GUI应用的完整范例。