FLTK-Rs 2

article/2025/9/1 13:24:13

Trees

树形结构,允许在树中显示项目,使用add方法发添加条目

use fltk::{prelude::*, *};
use fltk::enums::FrameType;fn main() {let a = celet mut win = window::Window::default().with_size(400, 300);let mut tree = tree::Tree::new(5,5,390,290,"");tree.set_root_label("Trceee_try");tree.add("Item 1");tree.add("Item 2");tree.add("Item 3");tree.add("Item 1/1");tree.add("Item 1/2");tree.add("Item 2/3");win.end();win.show();tree.set_callback(|tree| match tree.get_selected_items(){Some(s) => {for item in s{ println!("{} selected", tree.item_pathname(&item).unwrap());}}_ =>{},});a.run().unwrap();
}

我们的树组件初始化设定为仅单选。实际上我们可以通过一些设置设置样式与多选

// 允许多选
tree.set_select_mode(tree::TreeSelect::Multi);
// 实现或者虚线
tree.set_connector_style(tree::TreeConnectorStyle::Dotted);
// 线条颜色
tree.set_connector_color(Color::from_rgb(127,187,135));

Custom widgets

除了上述组件之外(我觉得够用了), fltk-rs还允许我们自定义组件。我们自定义的组件可以是完全自己写的~~(应该不会有人从零开写吧。。)~~, 或者是从前面的组件衍生出来的。我们定义组件结构体的时候要定义两个东西:衍生的组件,以及组件的数据的存储。

eg.

struct MyCustomButton {// 我们的组件inner: widget::Widget,// 我们的数据num_clicks: Rc<RefCell<i32>>,
}

我们这里存储数据使用的是Rc<RefCell<some>>>的结构。这个很重要, 因为我们在回调(callback)的时候我们需要移动这个数据到callback块中。然而,我们访问的时候却又要改变他,所以所有权一直在我们GUI调用线程中。所以使用RC<RefCell的方式定义保证数据的可用性。举个简单的例子:

use std::rc::Rc;
fn main() {let p = Rc::from(RefCell::from(10));// p,q指向同一块地址let q = p.clone();// 拿走了p的所有权let h = (move ||{*p.borrow_mut() = 20;});h();// 但是q仍能访问,而p也可以在其他块中被更改println!("{:?}",q);
}
RefCell { value: 20 }

所以我们的数据通过Rc 包裹 Refcell的方式去存储。

定义好结构体后,我们就需要定义方法了。其中最重要的方法就是初始化

struct MyCustomButton {inner: widget::Widget,num_clicks: Rc<RefCell<i32>>,
}impl MyCustomButton {// 我们的结构体// 我们定义的是一个圆形的按钮,r是半径pub fn new(radius: i32, label: &str) -> Self {// 我们的圆形站的尺寸的xy应该是直径缩影成2,最中间let mut inner = widget::Widget::default().with_size(radius * 2, radius * 2).with_label(label).center_of_parent();// 设定帧样式,后面我会介绍。其实就是一俺家样式,样式是库里的没啥问题inner.set_frame(enums::FrameType::OFlatBox);// 初始化我们的数据let num_clicks = 0;let num_clicks = Rc::from(RefCell::from(num_clicks));let clicks = num_clicks.clone();// 在按钮内部写字,协商按钮是干啥的。这个draw有点意思inner.draw(|i| { // we need a draw implementationdraw::draw_box(i.frame(), i.x(), i.y(), i.w(), i.h(), i.color());draw::set_draw_color(enums::Color::Black); // for the textdraw::set_font(enums::Font::Helvetica, 14);draw::draw_text2("Our button", i.x(), i.y(), i.w(), i.h(), i.align());});// 这个ev 我不太清楚干嘛用的,不过是判断点击用的我倒是清楚inner.handle(move |i, ev| match ev {enums::Event::Push => {// 与我上面演示的变化原理相同*clicks.borrow_mut() += 1;// 这个call_back应该是默认为空i.do_callback(); // do the callback which we'll set using set_callback().true}_ => false,});Self {inner,num_clicks,}}// get the times our button was clicked// 这个功能是鸡肋,应该,,pub fn num_clicks(&self) -> i32 {*self.num_clicks.borrow()}
}

最后我们想使用的话需要使用extren宏将其变成我们可以使用的组件:

widget_extends!(MyCustomButton, widget::Widget, inner);

运行效果:

fn main() {let app = app::App::default().with_scheme(app::Scheme::Gleam);app::background(255, 255, 255); // make the background whitelet mut wind = window::Window::new(100, 100, 400, 300, "Hello from rust");let mut btn = MyCustomButton::new(50, "Click");btn.set_color(enums::Color::Cyan);btn.set_callback(|_| println!("Clicked"));wind.end();wind.show();app.run().unwrap();// print the number our button was clicked on exitprintln!("Our button was clicked {} times", btn.num_clicks());
}
Clicked
Our button was clicked 1 times

在这里插入图片描述

至此,常用的组件就介绍完毕了

Dialogs

我之前以为对话框应该算是组件的一个部分,可是没想到官方的数把它单列出来了啊,看来还是有点东西的

对话框可以分为两种类型,原生的(操作系统自带)的文件对话框(对于我Windows用户就是win32对话框) 和FLTK自己的对话框。

关于本机的对话框倒是没什么好说的,直接调用即可:

let mut dialog = dialog::NativeFileChooser::new(dialog::NativeFileChooserType::BrowseFile);
dialog.show();
// 返回文件的路径
println!("{:?}", dialog.filename());

这里的对话框有六个接口可供选择,单选文件,文件夹;多选文件,文件夹; 保存文件,文件夹路径。我们还可以加文件类型过滤:

dialog.set_filter("*.{txt,rs,toml,py}");

总之还是很简单的,重点是FLTK自带的对话框:

FLTK提供了几个对话框方便我们构建应用:

  • Help 这个对话框可以显示html文档,当然也可以我们自己输入显示的文字

    let mut help = dialog::HelpDialog::new(100, 100, 400, 300);
    help.set_value("<h2>Hello world</h2>"); // this takes html
    help.show();
    // 在另一个窗口展示的时候挂起主应用
    while help.shown() {app::wait();
    }
    

    在这里插入图片描述

  • Message:

    //dialog::message(坐标x,坐标y,"你要写的话”);, 效果和下面一样,只不过自定义了位置。不定义的话就是center默认
    dialog::message_default("This is a Message\nA important message");
    

    在这里插入图片描述

  • Choice:选择对话框,不过只能由三个选项

    // 设置弹窗标题
    dialog::message_title_default("Save or Not");
    // 选项的显示是从左到右的0,1,2
    let choice = dialog::choice2_default("Would you like to save", "No", "Yes", "Cancel");
    // 这里的choice返回的是Some类型
    println!("{:?}", choice);
    

    在这里插入图片描述

​ cancle 2, Yes 1, No 0

  • Input/ Password:

    dialog::message_title_default("Input name");
    let choice = dialog::input_default("Pleasr input your name", "None");
    // 返回值依然是Some
    println!("{:?}", choice);
    //password就是input的铭文编程不可见的密文小点点。
    

    在这里插入图片描述

Custom Dialog:

这些对话框并不是不好看,但是怎么说呢,上个时代的风格确实太浓了点,而且没办法更自由地定义一些东西。所以我们需要自定义对话框。对话框,本质是新开的窗口,话句话说我们定义窗口即可。

// 官网的小李子
use fltk::{app, button,enums::{Color, Font, FrameType},frame, group, input,prelude::*,window,
};// 设置button的样式
fn style_button(btn: &mut button::Button) {btn.set_color(Color::Cyan);btn.set_frame(FrameType::RFlatBox);btn.clear_visible_focus();
}pub fn show_dialog() -> MyDialog {MyDialog::default()
}pub struct MyDialog {inp: input::Input,
}impl MyDialog {pub fn default() -> Self {let mut win = window::Window::default().with_size(400, 100).with_label("My Dialog");// 这里原来是由用到布局工具的,但是我把它改了方便大家看win.set_color(Color::from_rgb(240, 240, 240));let mut inp = input::Input::new(150,35, 100, 30,"Input name");inp.set_frame(FrameType::FlatBox);let mut ok = button::Button::new(300,35,80, 30,"Ok");style_button(&mut ok);win.end();// 只允许运行当前窗体达到弹窗的效果,不允许窗体关闭win.make_modal(true);win.show();ok.set_callback({let mut win = win.clone();move |_| {// 窗体关闭,由于我们要让主appwait, 所以我们下面海涌到了win,所以这里用的clone方法win.hide();}});while win.shown() {app::wait();}Self { inp }}pub fn value(&self) -> String {self.inp.value()}
}fn main() {let a = app::App::default();app::set_font(Font::Times);let mut win = window::Window::default().with_size(600, 400);win.set_color(Color::from_rgb(240, 240, 240));let mut btn = button::Button::default().with_size(80, 30).with_label("Click").center_of_parent();style_button(&mut btn);// 这里没想到这个frame布局还可以这么用,挺好玩的let mut frame = frame::Frame::new(btn.x() - 40, btn.y() - 100, btn.w() + 80, 30, None);frame.set_frame(FrameType::BorderBox);frame.set_color(Color::Red.inactive());win.end();win.show();btn.set_callback(move |_| {let d = show_dialog();// 同步更新frame.set_label(&d.value());});a.run().unwrap();
}

在这里插入图片描述

Pictures

我们GUI无论样式如何都是要使用图片来美化我们的应用的,FLTK支持一堆图片使用的,请参考官网支持的图片种类:https://fltk-rs.github.io/fltk-book/Images.html

fn main() {let app = app::App::default().with_scheme(app::Scheme::Gleam);let mut wind = window::Window::new(100, 100, 400, 300, "Hello from rust");let mut frame = frame::Frame::new(20,20,90,160,"");let mut image = image::JpegImage::load("。。。1.jpg").unwrap();// 强转大小image.scale(90,160,true,true);frame.set_image(Some(image));wind.make_resizable(true);wind.end();wind.show();// 当图片被点击的时候触发frame.handle(|frame,ev|{match ev{enums::Event::Push => {// 与我上面演示的变化原理相同println!("Clicked");true}_ => false,}});app.run().unwrap();
}

简单代码意思一下。此外除了set_picture, 我们还可以使用draw方法,这样在大部分组件中都可以使用图片了

use fltk::{prelude::*, *};
use fltk::enums::FrameType;fn main() {let app = app::App::default().with_scheme(app::Scheme::Gleam);let mut wind = window::Window::new(100, 100, 400, 300, "Hello from rust");let mut button = button::Button::new(10,10,200,200,"");let mut image = image::JpegImage::load("C:/Users/40629/Desktop/image/1.jpg").unwrap();button.draw(move |b|{image.scale(b.w(),b.h(),true,true);image.draw(b.x(),b.y(),b.w(),b.h());});wind.make_resizable(true);wind.end();wind.show();button.set_callback(|button|{println!("clicked");});app.run().unwrap();
}

Events

我们前面所接触的大部分不见为我们提供了callback方法进行回调,但是fltk给了我们更多的操作空间,比如我之前使用handle.这一节会讲解这些东西的用法:

  • callback,前面已经讲过很多了,我觉得没必要再说了。callback可以接受闭包,也可以接收函数。闭包只是因为更方便

  • handle: handle 方法接受一个参数为 Event 的闭包,并为已处理的事件返回一个 bool。bool 让 FLTK 知道事件是否被处理。这也是为什么我前面的代码都要返回一个bool的原因。eg.

    frame.handle(|frame,ev|{match ev{// Push单机,此外还有一些方法enums::Event::Push => {// 与我上面演示的变化原理相同println!("Clicked");true}_ => false,}});
    
  • emit: 使用sender/ receiver的消息使用消费者模型,我们在菜单组件中也有介绍过哦:

    fn main() {let app = app::App::default();let mut my_window = window::Window::new(100, 100, 400, 300, "My Window");let mut but = button::Button::new(160, 200, 80, 40, "Click me!");my_window.end();my_window.show();// 这里是用app_cahhel定义,而不是我们生产者消费者模型的channel定义// 当然,这里用生产者消费者模型也完全没问题let (s, r) = app::channel();but.emit(s, true);// 循环监听while app.wait() {// 收到消息(没被阻塞)就完成下面的操作if let Some(msg) = r.recv() {match msg {true => println!("Clicked"),false => (), // Here we basically do nothing}}}
    }
    
  • 自定义事件:讲道理我觉得已有的29个事件够用了,我反正是没啥遗憾啦,如果想看自定义事件参见:https://fltk-rs.github.io/fltk-book/Events.html


http://chatgpt.dhexx.cn/article/AJsqgEs2.shtml

相关文章

FLTK的UI设计工具FLUID使用方法总结

tags: FLTK C GUI 写在前面 终于又捡起来FLTK了, 先来看看怎么通过FLUID创建一个图形界面并完成回调函数的创建, 参考的是官方教程中关于创建一个CubeView程序的例子, 教程里面很多都与最新版本的FLTK界面不太一致, 但是通过我的摸索还是找出了方法. 下面来分享一下. 创建类…

fltk和glog在mac下的安装与编译

glog 根据官方文档安装即可 https://github.com/google/glog % git clone https://github.com/google/glog.git % cd glog % cmake -S . -B build -G "Unix Makefiles" //这句含义未知 % cmake --build build安装完后可以去/usr/local目录下查看是否有对应的头文件…

c语言fltk图形库,FLTK编程模型

2003 年 5 月 10 日 FLTK(Fast Light Tool Kit 发音为fulltick) 是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性…

FLTK-Rs

终于还是到这一步了&#xff0c;可视化&#xff0c;我的超人&#xff01; FLTK是一个跨平台的轻量级 gui 库。该库本身是用 C98 编写的&#xff0c;具有很高的可移植性。fltk crate 是用 Rust 编写的&#xff0c;并使用 FFI 调用 FLTK 包装器cfltk&#xff0c;它是用 C89 和 C…

Visual Studio 安装 FLTK

Visual Studio 安装 FLTK 环境介绍 Windows 10Visual Studio Community 2019 (2021-11-29补充2022版)FLTK-1.3.7 下载与解压 ​ 进入FLTK官网-Download下载最新版本。 ​ 解压到D:\Program Files\fltk(解压路径任意都行)&#xff0c;推荐使用Bandzip免费解压工具。 编译 …

FLTK--轻量级C++跨平台GUI库

FLTK FLTK&#xff08;Fast Light Toolkit&#xff09;是一个跨平台的CGUI工具集&#xff0c;用在UNIX/Linux&#xff08;X11&#xff09;、微软Windows和Mac OS X上。FLTK提供现代的GUI功能&#xff0c;除却膨胀&#xff0c;通过OpenGL和内建的GLUT模拟器提供3D图形支持。最初…

浅谈如何fltk项目编译和实现显示中文

目录 一、编译 二、中文显示如何处理&#xff1a; 2.1在发文2天前突然发现&#xff0c;我这个界面显示英文出现问题了&#xff0c;开始我的搜索之旅&#xff0c;一些参考页面有碰到问题也可以看看&#xff1a; 2.2、 那就开始翻翻官方自带的例程吧&#xff0c;看看他如何显…

FLTK 学习一:简介和安装

文章目录 FLTK 简介FLTK 安装FLTK Windows安装FLTK Linux 安装 FLTK 简单示例参考资料 FLTK 简介 从网上引用的一段 FLTK 的介绍 FLTK (Fast Light Tool Kit 发音为fulltick) 是一种使用 C 开发的 GUI 工具包&#xff0c;它可以应用于 Unix, Linux, MS-Windows95/98/NT/2000 和…

安装使用FLTK图形库

FLTK是Fast Light Toolkit的简称&#xff0c;是一个跨平台的C GUI包&#xff0c;FLTK提供xiandai GUI功能&#xff0c;而且通过OpenGL支持3D图像。 下载FLTK安转包fltk-1.3.4-1-source.tar.gz&#xff1a; http://www.fltk.org/software.php?VERSION1.3.4&FILEfltk/1.3.…

BOBCAT: 基于双层优化的计算机化自适应测验(超硬核解读论文+阅读论文技巧)

文章目录 前言AbstractIntroductionCAT 介绍传统的认知诊断模型传统的CAT选题策略传统方法局限性 ContributionsBOBCAT框架双层优化问题BOBCAT框架BOBCAT 训练过程 OptimizationExperiments能力评估问题暴露和内容重叠问题选择 Conclusions 前言 大家好&#xff0c;我是小曾&a…

项目管理理论与实践(3)——如何进行有效的项目管理

对于具有成功并有效的项目管理经验的项目经理&#xff0c;还是非常难得的。因为项目管理并不是一件很简单的事情。虽然自己对于项目管理的理解还是处于初级阶段&#xff0c;但是利用自己学习到的理论知识&#xff0c;还是想做一次归纳&#xff0c;希望对大家能够受用。那么就开…

计算机自适应考试技巧,计算机自适应题库实现

在软件的开发中,基于题库的计算机自适应考试已成为一个重要的发展方向,而计算机自适应题库的建立就显得尤为重要。计算机自适应测验(Computerized Adaptive Testing,简称CAT)是近年来发展起来的一种新的测验形式。这种测验以项目反应理论为基础,以计算机技术为手段,在题库…

项目经理都会面临什么问题?

最近手里一个项目接近尾声&#xff0c;还有一个项目正在初期调研&#xff0c;无缝衔接&#xff0c;原定结项之后的3天假期也泡汤了&#xff0c;每一个环节都出问题我真的会心累&#xff0c;再加上最近组里人事变动&#xff0c;也没有及时做好复盘&#xff0c;客户又出现了临时需…

反应-扩散方程(Reaction-diffusion system)

文章目录 1. 单组分反应-扩散方程2. 双组分反应-扩散方程3. 三组分和更多组分的反应-扩散方程4. Fishers equation4.1 KPP方程 5. Belousov–Zhabotinsky reaction5.1 历史5.2 化学机理5.2.1 变体 5.3 Noise-induced order5.3.1 数学背景 6. Briggs–Rauscher reaction7. ZFK e…

项目延期的因素有哪些?项目经理应该如何应对

项目延期是项目管理中常见的问题之一&#xff0c;也是管理者最头疼的问题。项目延期的出现可能是由于以下原因&#xff1a; 1、工作中突发事件多&#xff1a;在评估工作量时&#xff0c;通常会基于过往的经验来进行评估&#xff0c;但由于信息社会中各种信息随处可见&#xf…

项目管理中影响项目进度的原因及解决方法

项目管理中对工期的控制主要是进度控制&#xff0c;在项目进行过程中&#xff0c;由于项目时间跨度长&#xff0c;人员繁杂&#xff0c;如果管理不规范&#xff0c;就容易导致项目进度滞后&#xff0c;如何管理好施工进度是管理者需要解决的问题之一。 1、项目计划缺乏执行力…

图解PMP项目管理马斯洛需求层次理论在公司管理中的应用!

马斯洛的需求层次结构是心理学中的激励理论&#xff0c;包括人类需求的五级模型&#xff0c;通常被描绘成金字塔内的等级。 从层次结构的底部向上&#xff0c;需求分别为&#xff1a;生理&#xff08;食物和衣服&#xff09;&#xff0c;安全&#xff08;工作保障&#xff09;…

php 项目反应理论,科学网—好文 | 纽约石溪大学:机器学习中基于项目反应理论的集成学习 - 陈培颖的博文...

机器学习中&#xff0c;研究者们对分类集成的关注与日俱增&#xff0c;尤其关注分类精度的提升。IJAC近期发表了来自纽约石溪大学研究者的最新成果&#xff0c;该研究基于项目反应理论&#xff0c;提出一种加权投票方法---基于IRT理论的集成学习算法&#xff0c;该方法可正确处…

项目反应理论 EM估计

项目反应理论参数的EM估计 写在前面&#xff1a; 本文主要描述了整个IRT使用EM算法参数的估计过程&#xff0c;其中涉及大量公式&#xff0c;如只是需要了解IRT相关基础知识&#xff0c;请转战wiki&#xff5e;&#xff5e; 预警&#xff1a; 大量公式来袭&#xff5e;&#…

项目反应理论

项目反应理论(item response theory)是属于心理学中认知诊断常用的一种理论,即根据被测试者针对某个问题的答案来对被测者的认知状况进行估计。“项目”实质就是测试题,“反应”就是被测者的答案。也有学者称项目反应理论也是机器学习中的一个类别,即根据被测者对测试题的…