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的过程宏来创建自定义控件:

  1. 使用#[widget]属性宏定义自定义控件
  2. 通过派生WidgetBaseWidgetExtWidgetType来获得基本功能
  3. 使用#[inherit]属性继承现有控件类型
  4. 定义子控件作为结构体成员
  5. 实现自定义方法和行为

该库简化了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();
}

代码说明

  1. 自定义控件CounterButton:

    • 继承自FLTK的Button控件
    • 添加了点击计数功能
    • 使用derive宏自动实现了WidgetBase和WidgetExt trait
  2. 组合控件LoginPanel:

    • 使用Flex布局管理器
    • 包含用户名/密码输入框和两个按钮
    • 使用derive宏自动实现了WidgetBase、WidgetExt和GroupExt trait
  3. 回调处理:

    • 展示了闭包中如何使用克隆的控件引用
    • 登录按钮处理表单提交
    • 计数按钮记录点击次数并更新标签
  4. 样式设置:

    • 自定义按钮设置了特殊的背景颜色
    • 使用Flex布局自动调整控件大小和位置

这个示例展示了fltk-derive库的主要功能,包括自定义控件、组合控件和回调处理,是使用该库开发GUI应用的完整范例。

回到顶部