当前位置: 首页 > news >正文

<Rust>egui学习之小部件(九):如何在窗口中添加下拉列表combobox部件?

前言
本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。

环境配置
系统:windows
平台:visual studio code
语言:rust
库:egui、eframe

概述
本文是本专栏的第九篇博文,主要讲述下拉列表部件combobox的使用。

事实上,类似于iced,egui都提供了示例程序,本专栏的博文都是建立在官方示例程序以及源代码的基础上,进行的实例讲解。
即,本专栏的文章并非只是简单的翻译egui的官方示例与文档,而是针对于官方代码进行的实际使用,会在官方的代码上进行修改,包括解决一些问题。

系列博客链接:
1、<Rust>egui学习之小部件(一):如何在窗口及部件显示中文字符?
2、<Rust>egui学习之小部件(二):如何在egui窗口中添加按钮button以及标签label部件?
3、<Rust>egui学习之小部件(三):如何为窗口UI元件设置布局(间隔、水平、垂直排列)?
4、<Rust>egui学习之小部件(四):如何在窗口中添加滚动条Scroll部件?
5、<Rust>egui学习之小部件(五):如何在窗口中添加图像部件?
6、<Rust>egui学习之小部件(六):如何在窗口中添加菜单栏部件?
7、<Rust>egui学习之小部件(七):如何在窗口中添加颜色选择器colorpicker部件?
8、<Rust>egui学习之小部件(八):如何在窗口中添加滑动条slider部件?

部件属性

在egui中,下拉列表combobox部件提供下拉选项,其属性如下:

#[must_use = "You should call .show*"]
pub struct ComboBox {id_source: Id,label: Option<WidgetText>,selected_text: WidgetText,width: Option<f32>,height: Option<f32>,icon: Option<IconPainter>,wrap_mode: Option<TextWrapMode>,
}

事实上,下拉列表形式与菜单类似,都是点击后弹出一列元素。
我们来一下combobox的典型应用,我们以三种颜色红、黄、绿为选项:

 let id=egui::Id::new("color1");ComboBox::new(id,"颜色框")//.icon(|ui,rect,visuals,is_open,above_or_below|setuifont::filled_triangle(ui, rect, visuals, is_open, above_or_below)).selected_text(format!("{:?}",self.selected)).show_ui(ui, |ui|{ui.selectable_value(&mut self.selected, CC::红色,RichText::new("红色").background_color(Color32::RED));ui.selectable_value(&mut self.selected, CC::绿色,RichText::new("绿色").background_color(Color32::GREEN));ui.selectable_value(&mut self.selected, CC::黄色,RichText::new("黄色").background_color(Color32::YELLOW));});

在这里插入图片描述
其中,文字的背景色是通过richtext元素来修改的,combobox本身不提供这些属性。
不过,我们可以修改下拉框右侧的图标,即三角形箭头,这实际上是一个绘制的矢量图形,我们可以通过icon属性来更改它:

 let id=egui::Id::new("color1");ComboBox::new(id,"颜色框").icon(|ui,rect,visuals,is_open,above_or_below|setuifont::filled_triangle(ui, rect, visuals, is_open, above_or_below)).selected_text(format!("{:?}",self.selected)).show_ui(ui, |ui|{ui.selectable_value(&mut self.selected, CC::红色,RichText::new("红色").background_color(Color32::RED));ui.selectable_value(&mut self.selected, CC::绿色,RichText::new("绿色").background_color(Color32::GREEN));ui.selectable_value(&mut self.selected, CC::黄色,RichText::new("黄色").background_color(Color32::YELLOW));});

注意,此处icon的参数是一个闭包,我们为其传入了一个函数,这个函数如下:

pub fn filled_triangle(ui: &egui::Ui,rect: egui::Rect,visuals: &egui::style::WidgetVisuals,_is_open: bool,_above_or_below: egui::AboveOrBelow,) {let rect = egui::Rect::from_center_size(rect.center(),egui::vec2(rect.width() * 0.6, rect.height() * 0.4),);ui.painter().add(egui::Shape::convex_polygon(vec![rect.left_top(), rect.right_top(), rect.center_bottom(),//rect.left_bottom()],visuals.fg_stroke.color,visuals.fg_stroke,));}

上面的代码绘制出来的也是一个倒三角,但是我们可以修改其绘制路径:

 ui.painter().add(egui::Shape::convex_polygon(vec![rect.left_top(), rect.right_top(), rect.center_bottom(),rect.left_bottom()],

加上一个点位,就变成了四边形:
在这里插入图片描述
combobox的参数里,我们注意到selected_text的参数是一个变量,即当我们选择不同的选项后,变量保存相应的值,对应本例中,即红色、黄色、绿色三种颜色。
而show_ui表示显示出下拉列表元素,显示的具体,则依据你写的代码来。
本例中下拉菜单中的三个元素便是如此添加的。

下拉列表部件提供了可选项,且可设置变量保存实时选择的值,这样我们就可以根据变量的值的不同来编写其他逻辑了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 同城搭子怎么找?靠谱找搭子平台排行榜前十名测评
  • Typora调整图片大小:两种方式zoom或width/height
  • [数据集][目标检测]街头摊贩识别检测数据集VOC+YOLO格式758张1类别
  • 【干货分享】央企国企的群面、半结构面试复习方法和经验总结
  • Java网络编程入门
  • 【生日视频制作】保时捷车主提车交车仪式感AE模板修改文字软件生成器教程特效素材【AE模板】
  • 创建Hive表后,查看表结构发现中文注释乱码
  • 【spring】RuleOptions RecommendCtx
  • 面试—Linux
  • dpdk——数据平面开发套件
  • 【开源免费】基于SpringBoot+Vue.J大学生租房平台(JAVA毕业设计)
  • Unity Xcode方式接入sdk
  • HashMap中常用的函数
  • 828华为云征文 | 搭建云服务器Flexus X实例,开启简单上云第一步
  • python的常用模块,必能覆盖你的需求
  • 【Amaple教程】5. 插件
  • 【EOS】Cleos基础
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Electron入门介绍
  • exif信息对照
  • JavaScript函数式编程(一)
  • JS+CSS实现数字滚动
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Objective-C 中关联引用的概念
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue-cli在webpack的配置文件探究
  • vue数据传递--我有特殊的实现技巧
  • Zsh 开发指南(第十四篇 文件读写)
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端学习笔记之观察者模式
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 首页查询功能的一次实现过程
  • 小试R空间处理新库sf
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • (003)SlickEdit Unity的补全
  • (10)STL算法之搜索(二) 二分查找
  • (C语言)球球大作战
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十) 初识 Docker file
  • (十七)Flink 容错机制
  • (算法设计与分析)第一章算法概述-习题
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)基于IDEA的JAVA基础10
  • (原)Matlab的svmtrain和svmclassify
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (源码分析)springsecurity认证授权
  • (转)C语言家族扩展收藏 (转)C语言家族扩展