216 个版本 (33 个稳定版)
1.2.5 | 2021年10月2日 |
---|---|
1.1.15 | 2021年8月31日 |
1.1.5 | 2021年7月31日 |
0.16.5 | 2021年4月9日 |
0.1.22 | 2020年3月31日 |
#787 in #gui
86 每月下载量
180KB
4.5K SLoC
fltk-rs
Rust 对 FLTK 图形用户界面库的绑定。
fltk crate 是一个跨平台的轻量级GUI库,可以静态链接以生成小型、自包含且快速的GUI应用程序。
资源
- 书籍
- 本书的中文翻译
- 文档
- 视频
- 讨论
- 示例
- 演示
- 7guis-fltk-rs
- FLTK-RS-Examples
- Erco的FLTK速查页面,这是一个极好的FLTK C++参考。
为什么选择FLTK?
- 轻量级。二进制文件小,去冗余后大约1MB。 内存占用小。
- 速度。安装快、构建快、启动快、运行快。
- 单个可执行文件。无需部署DLL。
- 支持旧架构。
- FLTK的开源许可证允许静态链接用于封闭源代码应用程序。
- 可主题化(支持5种方案:Base、GTK、Plastic、Gleam和Oxy),并可以使用fltk-theme进行额外的主题化。
- 提供约80个可定制的小部件。
- 内置图像支持。
以下是使用FLTK的软件列表。对于使用fltk-rs的软件,请查看此处。
使用方法
只需将以下内容添加到您的项目Cargo.toml文件中
[dependencies]
fltk = "^1.4"
要使用仓库中的最新更改
[dependencies]
fltk = { version = "^1.4", git = "https://github.com/fltk-rs/fltk-rs" }
或者如果您有其他依赖于fltk-rs的依赖项
[dependencies]
fltk = "^1.4"
[patch.crates-io]
fltk = { git = "https://github.com/fltk-rs/fltk-rs" }
要使用捆绑的库(适用于x64 Windows (msvc & gnu (msys2-mingw))、x64 & aarch64 Linux & macOS)
[dependencies]
fltk = { version = "^1.4", features = ["fltk-bundled"] }
库将自动构建并静态链接到您的二进制文件。
一个hello world示例应用程序
use fltk::{app, prelude::*, window::Window};
fn main() {
let app = app::App::default();
let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
wind.end();
wind.show();
app.run().unwrap();
}
另一个示例,展示了基本的回调功能
use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};
fn main() {
let app = app::App::default();
let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
let mut frame = Frame::new(0, 0, 400, 200, "");
let mut but = Button::new(160, 210, 80, 40, "Click me!");
wind.end();
wind.show();
but.set_callback(move |_| frame.set_label("Hello World!")); // the closure capture is mutable borrow to our button
app.run().unwrap();
}
请查看示例目录获取更多示例。您会注意到所有小部件都是通过new()方法实例化的,该方法接收小部件的x和y坐标、宽度、高度以及一个标签,如果需要可以留空。初始化小部件的另一种方法是使用构建器模式:(以下按钮是等价的)
use fltk::{button::Button, prelude::*};
let but1 = Button::new(10, 10, 80, 40, "Button 1");
let but2 = Button::default()
.with_pos(10, 10)
.with_size(80, 40)
.with_label("Button 2");
一个使用构建器模式的计数器示例
use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};
fn main() {
let app = app::App::default();
let mut wind = Window::default()
.with_size(160, 200)
.center_screen()
.with_label("Counter");
let mut frame = Frame::default()
.with_size(100, 40)
.center_of(&wind)
.with_label("0");
let mut but_inc = Button::default()
.size_of(&frame)
.above_of(&frame, 0)
.with_label("+");
let mut but_dec = Button::default()
.size_of(&frame)
.below_of(&frame, 0)
.with_label("-");
wind.make_resizable(true);
wind.end();
wind.show();
/* Event handling */
app.run().unwrap();
}
或者,您可以使用Flex(用于flexbox布局)、Pack或Grid
use fltk::{app, button::Button, frame::Frame, group::Flex, prelude::*, window::Window};
fn main() {
let app = app::App::default();
let mut wind = Window::default().with_size(160, 200).with_label("Counter");
let mut flex = Flex::default().with_size(120, 140).center_of_parent().column();
let mut but_inc = Button::default().with_label("+");
let mut frame = Frame::default().with_label("0");
let mut but_dec = Button::default().with_label("-");
flex.end();
wind.end();
wind.show();
app.run().unwrap();
}
另一个示例
use fltk::{app, button::Button, frame::Frame, group::Flex, prelude::*, window::Window};
fn main() {
let app = app::App::default();
let mut wind = Window::default().with_size(400, 300);
let mut col = Flex::default_fill().column();
col.set_margins(120, 80, 120, 80);
let mut frame = Frame::default();
let mut but = Button::default().with_label("Click me!");
col.fixed(&but, 40);
col.end();
wind.end();
wind.show();
but.set_callback(move |_| frame.set_label("Hello world"));
app.run().unwrap();
}
事件
可以使用set_callback
方法(如上所示)或可用的fltk::app::set_callback()
自由函数来处理事件,该函数将处理每个小部件的默认触发器(如按钮的点击)
/* previous hello world code */
but.set_callback(move |_| frame.set_label("Hello World!"));
another_but.set_callback(|this_button| this_button.set_label("Works"));
app.run().unwrap();
另一种方法是使用消息传递
/* previous counter code */
let (s, r) = app::channel::<Message>();
but_inc.emit(s, Message::Increment);
but_dec.emit(s, Message::Decrement);
while app.wait() {
let label: i32 = frame.label().parse().unwrap();
if let Some(msg) = r.recv() {
match msg {
Message::Increment => frame.set_label(&(label + 1).to_string()),
Message::Decrement => frame.set_label(&(label - 1).to_string()),
}
}
}
有关代码的其余部分,请查看完整的示例此处。
对于自定义事件处理,可以使用handle()方法
some_widget.handle(move |widget, ev: Event| {
match ev {
Event::Push => {
println!("Pushed!");
true
},
/* other events to be handled */
_ => false,
}
});
使用handle方法处理或忽略的事件应返回true,未处理的事件应返回false。更多示例可在fltk/examples目录中找到。
对于使用即时模式方法的替代事件处理机制,请查看fltk-evented crate。
主题
FLTK提供了5种应用程序方案
- 基础
- Gtk
- Gleam
- Plastic
- Oxy
(在fltk-theme crate)中可以找到额外的主题)
这些可以通过App::with_scheme()
方法设置。
let app = app::App::default().with_scheme(app::Scheme::Gleam);
可以使用WidgetExt
特质中提供的方法可选地修改单个小部件的主题,例如set_color()
、set_label_font()
、set_frame()
等
some_button.set_color(Color::Light1); // You can use one of the provided colors in the fltk enums
some_button.set_color(Color::from_rgb(255, 0, 0)); // Or you can specify a color by rgb or hex/u32 value
some_button.set_color(Color::from_u32(0xffebee));
some_button.set_frame(FrameType::RoundUpBox);
some_button.set_font(Font::TimesItalic);
对于默认应用程序颜色,fltk-rs提供了app::background()
、app::background2()
和app::foreground()
。您还可以指定默认应用程序选择/非活动颜色、字体、标签大小、框架类型、滚动条大小、菜单行间距。此外,fltk-theme crate还提供了一些其他预定义的颜色图(深色主题、米色等)和可以加载到您的应用程序中的小部件主题。
构建依赖项
Rust(版本 > 1.63)、CMake(版本 > 3.15)、Git和C++17编译器需要安装并添加到您的PATH中,才能从源代码进行跨平台构建。Ninja是推荐的,但不是必需的。此crate还提供了一些x86_64和aarch64平台(Windows(msvc和gnu)、MacOS、Linux)上预包装的fltk版本,这可以通过在用法部分中提到的fltk-bundled功能标志启用(这需要curl和tar下载和解包预包装的库)。
- Windows
- MSVC: Windows SDK
- Gnu: 无依赖
- MacOS: 无依赖。
- Linux/BSD: 开发需要安装 X11 和 OpenGL 的开发头文件。这些库通常在带有图形用户界面的 Linux/bsd 发行版上可用。
对于基于 Debian 的 GUI 发行版,这意味着运行
sudo apt-get install libx11-dev libxext-dev libxft-dev libxinerama-dev libxcursor-dev libxrender-dev libxfixes-dev libpango1.0-dev libgl1-mesa-dev libglu1-mesa-dev
对于基于 RHEL 的 GUI 发行版,这意味着运行
sudo yum groupinstall "X Software Development" && yum install pango-devel libXinerama-devel libstdc++-static
对于基于 Arch 的 GUI 发行版,这意味着运行
sudo pacman -S libx11 libxext libxft libxinerama libxcursor libxrender libxfixes pango cairo libgl mesa --needed
对于 Alpine Linux
apk add pango-dev fontconfig-dev libxinerama-dev libxfixes-dev libxcursor-dev mesa-gl
对于 NixOS(Linux 发行版),可以使用此 nix-shell
环境
nix-shell --packages rustc cmake git gcc xorg.libXext xorg.libXft xorg.libXinerama xorg.libXcursor xorg.libXrender xorg.libXfixes libcerf pango cairo libGL mesa pkg-config
运行时依赖
- Windows: 无
- MacOS: 无
- Linux: 您需要 X11 库,以及 pango 和 cairo 用于绘图(如果您想启用 enable-glwindow 功能,还需要 OpenGL)
apt-get install -qq --no-install-recommends libx11-6 libxinerama1 libxft2 libxext6 libxcursor1 libxrender1 libxfixes3 libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libpangoxft-1.0-0 libglib2.0-0 libfontconfig1 libglu1-mesa libgl1
请注意,如果您安装了构建依赖项,它还将自动安装运行时依赖项。
另外请注意,大多数图形桌面环境已经安装了这些库。此列表可以在您想测试已经构建的软件包在 CI/docker(其中没有图形用户界面)中时有用。
特性
以下是由 crate 提供的特性
- use-ninja: 如果可用,使用 ninja 构建系统以实现更快的构建,特别是在 Windows 上。
- no-pango: 在 Linux/BSD 上构建不带 pango 支持,如果不需要 rtl/cjk 字体支持。
- fltk-bundled: 在选定平台上支持 cfltk 和 fltk 的捆绑版本(需要 curl 和 tar)
- enable-glwindow: 支持使用 OpenGL 函数进行绘图。
- system-libpng: 使用系统 libpng
- system-libjpeg: 使用系统 libjpeg
- system-zlib: 使用系统 zlib
- use-wayland: 使用 FLTK 的 wayland 混合后端(在存在 wayland 时在 wayland 上运行,在不存在时在 X11 上运行)。需要 libwayland-dev、wayland-protocols、libdbus-1-dev、libxkbcommon-dev、libgtk-3-dev(可选,用于 GTK 风格标题栏),以及 X11 开发包。示例 CI。
- fltk-config: 使用已安装的 FLTK 的 fltk-config 来构建此 crate。这仍然需要 FLTK 1.4。这对于减少构建时间,测试本地构建的 FLTK 很有用,并且不需要调用 git 或 cmake。
常见问题解答
请查看 FAQ 页面,了解常见问题、遇到的问题、部署指南和贡献。
构建
要构建,只需运行
git clone https://github.com/fltk-rs/fltk-rs --recurse-submodules
cd fltk-rs
cargo build
当前实现的数据类型
图像类型
- SharedImage
- BmpImage
- JpegImage
- GifImage
- AnimGifImage
- PngImage
- SvgImage
- Pixmap
- RgbImage
- XpmImage
- XbmImage
- PnmImage
- TiledImage
小部件
- 按钮
- Button
- RadioButton
- ToggleButton
- RoundButton
- CheckButton
- LightButton
- RepeatButton
- RadioLightButton
- RadioRoundButton
- ReturnButton
- ShortcutButton
- 对话框
- 本地文件对话框
- 文件选择器
- 帮助对话框
- 消息对话框
- 警告对话框
- 密码对话框
- 选择对话框
- 输入对话框
- 颜色选择器对话框
- 框架 (Fl_Box)
- Windows
- 窗口
- SingleWindow (单缓冲)
- DoubleWindow (双缓冲)
- MenuWindow
- OverlayWindow
- GlWindow (需要 "enable-glwindow" 标志)
- 实验性 GlWidgetWindow (需要 "enable-glwindow" 标志)
- 组
- Group
- Pack (水平和垂直)
- 标签
- 滚动
- 平铺
- 向导
- 颜色选择器
- Flex (列和行)
- 网格 (https://github.com/fltk-rs/fltk-grid)
- 文本显示小部件
- TextDisplay
- TextEditor
- 简单终端
- 输入小部件
- Input
- IntInput
- FloatInput
- MultilineInput
- SecretInput
- FileInput
- 输出小部件
- Output
- MultilineOutput
- 菜单小部件
- MenuBar
- MenuItem
- 选择(下拉列表)
- SysMenuBar(出现在屏幕顶部的MacOS菜单栏)
- 值选择器小部件
- 滑块
- NiceSlider
- ValueSlider
- 旋钮
- LineDial
- 计数器
- 滚动条
- 滚筒
- 调整器
- 值输入
- 值输出
- 填充滑块
- 填充旋钮
- HorSlider(水平滑块)
- HorFillSlider
- HorNiceSlider
- HorValueSlider
- 浏览小部件
- 浏览器
- SelectBrowser
- HoldBrowser
- MultiBrowser
- 文件浏览器
- CheckBrowser
- 杂项小部件
- Spinner
- 时钟(圆形和方形)
- 图表(提供多种图表类型)
- 进度(进度条)
- 工具提示
- 输入选择
- 帮助视图
- 表格小部件
- 表格
- 表格行
- SmartTable(通过fltk-table crate)
- 树
- 树
- 树项
绘图原语
(在draw模块中)
表面类型
- 打印机。
- ImageSurface。
- SvgFileSurface。
GUI设计器
fltk-rs支持FLUID,FLTK的RAD WYSIWYG设计器。查看fl2rust crate和fl2rust模板。
示例
运行示例
cargo run --example editor
cargo run --example calculator
cargo run --example calculator2
cargo run --example counter
cargo run --example hello_svg
cargo run --example hello_button
cargo run --example fb
cargo run --example pong
cargo run --example custom_widgets
cargo run --example custom_dial
...
使用自定义主题和FLTK提供的默认方案,如Gtk
不同的框架类型,可以与许多不同的小部件一起使用,如框架、按钮小部件、输入/输出小部件等。
更多有趣的示例可以在fltk-rs-demos 仓库中找到。还可以在这里找到7guis任务的出色实现这里。还可以在这里找到各种高级示例这里。
主题
更多主题可以在fltk-theme crate中找到。
等等...
额外小部件
此crate公开FLTK的 widget集,全部可定制。还可以在fltk-extras crate中找到额外的自定义小部件。
教程
依赖关系
~1.5MB
~34K SLoC