RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?

前言
本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。
iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1.

概述
这是本专栏的第三篇,主要讲述下拉列表pick_list部件的使用,会结合实例来说明。
系列博文链接
1、RustGUI学习(iced)之小部件(一):如何使用按钮和文本标签部件
2、RustGUI学习(iced)之小部件(二):如何使用滑动条部件

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

在这里插入图片描述
注:iced是一个受Elm启发而编写,适用于rust语言的跨平台的GUI库。

本篇内容:
1、pick_list

下拉列表部件

pick_list部件在iced中的定义如下:

/// Creates a new [`PickList`].     
///
/// [`PickList`]: crate::PickList
pub fn pick_list<'a, T, L, V, Message, Theme, Renderer>(options: L,selected: Option<V>,on_selected: impl Fn(T) -> Message + 'a,
) -> PickList<'a, T, L, V, Message, Theme, Renderer>
whereT: ToString + PartialEq + Clone + 'a,L: Borrow<[T]> + 'a,V: Borrow<T> + 'a,Message: Clone,Renderer: core::text::Renderer,Theme: pick_list::StyleSheet+ scrollable::StyleSheet+ overlay::menu::StyleSheet+ container::StyleSheet,<Theme as overlay::menu::StyleSheet>::Style:From<<Theme as pick_list::StyleSheet>::Style>,
{PickList::new(options, selected, on_selected)
}

其由PickList来创建:

/// A widget for selecting a single value from a list of options.              
#[allow(missing_debug_implementations)]
pub struct PickList<'a,T,L,V,Message,Theme = crate::Theme,Renderer = crate::Renderer,
> whereT: ToString + PartialEq + Clone,L: Borrow<[T]> + 'a,V: Borrow<T> + 'a,Theme: StyleSheet,Renderer: text::Renderer,
{on_select: Box<dyn Fn(T) -> Message + 'a>,on_open: Option<Message>,on_close: Option<Message>,options: L,placeholder: Option<String>,selected: Option<V>,width: Length,padding: Padding,text_size: Option<Pixels>,text_line_height: text::LineHeight,text_shaping: text::Shaping,font: Option<Renderer::Font>,handle: Handle<Renderer::Font>,style: Theme::Style,
}

我们来看以下pick_list涉及的参数或属性,首先是on_select,从其定义可知这是一个动态指针,在实际使用时,on_select表示当选择下拉列表时,会触发这个事件,其反馈当前选择的项。
然后是on_open和on_close两个属性,分别表示下拉列表在打开和关闭时返回的消息,因为通常来说,下拉列表并不太关注打开和关闭时的状态,所以此参数可以不设置,使用默认即可。
然后是options参数,顾名思义,此参数即是下拉列表部件的下拉选项,从其定义来说,是一个借用类型且具有相同的生命周期(与借用的数组一致)。在实际使用来说,此处应该是一个枚举数组。
placeholder参数比较简单,是一个枚举字符,实际表示下拉列表没有选项时显示的一个提示文字。如下:
在这里插入图片描述
接下来是selected,其定义也是枚举类型,但枚举的参数是借用类型,且具有借用数组一样的生命周期。此参数是实时显示选择的下拉项。需要在update函数里更新,否则下拉列表选择后并不会更新UI。
width、padding、text_size、text_line_height、text_shaping、font这些都是一些基本参数,比较简单,主要设置一些尺寸或者文字。
handle是下拉列表右侧的箭头的属性,默认是箭头,可以修改为其他预设,如:
在这里插入图片描述
修改了箭头的尺寸,显示如上,可以看到和默认的有明显区别。除了箭头外,还可以使用自定义侧icon来替换,只不过需要自行设计。如下:
在这里插入图片描述
使用字符作为handle,但通常来说,下拉列表常见的都是箭头。
再来看最后一个属性,style,和之前的部件一样,style用于设计下拉列表部件的外观,其在iced中的定义如下:

/// A set of rules that dictate the style of a container.  
pub trait StyleSheet {/// The supported style of the [`StyleSheet`].type Style: Default + Clone;/// Produces the active [`Appearance`] of a pick list.fn active(&self, style: &<Self as StyleSheet>::Style) -> Appearance;/// Produces the hovered [`Appearance`] of a pick list.fn hovered(&self, style: &<Self as StyleSheet>::Style) -> Appearance;
}

其中,Appearance定义如下:

/// The appearance of a pick list.       
#[derive(Debug, Clone, Copy)]
pub struct Appearance {/// The text [`Color`] of the pick list.pub text_color: Color,/// The placeholder [`Color`] of the pick list.pub placeholder_color: Color,/// The handle [`Color`] of the pick list.pub handle_color: Color,/// The [`Background`] of the pick list.pub background: Background,/// The [`Border`] of the pick list.pub border: Border,
}

可以看到,pick_list部件的Appearance有五个可设置的属性,其中,text_color是文字颜色,placeholder_color是空闲时的文字颜色,handle_color顾名思义是右侧箭头的颜色,background指背景设置,而border是边框设置。
下面我们设置一下自定义pick_list,首先新建一个pick_list的外观结构体:

struct MyPickListStyle;

然后对结构体实现StyleSheet:

impl pick_list::StyleSheet for MyPickListStyle {    type Style = Theme;//激活时外观fn active(&self, style: &Self::Style) -> pick_list::Appearance {pick_list::Appearance {text_color:Color::from_rgb8(142, 204, 240),placeholder_color:Color::BLACK,handle_color:Color::from_rgb8(18, 27, 155),background:Background::Color(Color::from_rgb8(215, 217, 249)),border:Border{color:Color::BLACK,width:1.0,radius:[3.0;4].into()},}
}fn hovered(&self, style: &Self::Style) -> pick_list::Appearance {pick_list::Appearance {text_color:Color::from_rgb8(76, 87, 240),placeholder_color:Color::BLACK,handle_color:Color::from_rgb8(18, 27, 155),background:Background::Color(Color::from_rgb8(215, 217, 249)),border:Border { color: Color::BLACK, width: 1.0, radius: [3.0;4].into() },}}
}

需要注意的是,pick_list的动态样式有些特别,看一下官方定义:

/// The style of a pick list. 
#[derive(Clone, Default)]
pub enum PickList {/// The default style.#[default]Default,/// A custom style.Custom(Rc<dyn pick_list::StyleSheet<Style = Theme>>,Rc<dyn menu::StyleSheet<Style = Theme>>,),
}

可以看到,其Custom选项有2个参数,除了pick_list样式外,还要求了menu样式,虽然不明白作者为什么这么设置,但如果要实现pick_list的自定义样式,我们必须为其添加第二个参数即menu部件的动态样式,所以我们还需要新建menu样式结构体:

struct MyMenuStyle;

然后设置StyleSheet:

impl menu::StyleSheet for MyMenuStyle {   type Style = Theme;fn appearance(&self, style: &Self::Style) -> menu::Appearance {menu::Appearance{text_color:Color::BLACK,background:Background::Color(Color::from_rgb8(215, 217, 249)),border:Border { color: Color::BLACK, width: 1.0, radius: [3.0;4].into() },selected_text_color:Color::BLACK,selected_background:Background::Color(Color::from_rgb8(180, 184, 248)),}}
}

当自定义样式设置好后,就可以调用了:

let style9=theme::PickList::Custom(Rc::new(MyPickListStyle),Rc::new(MyMenuStyle));  

然后设置pick_list的style属性即可,我们来看一下实际效果:
active:
在这里插入图片描述
hovered:
在这里插入图片描述
可以看到,自定义样式还是非常明显的不同的。

好了,关于属性的设置就说到这,接下来说一下options、selected、on_select这三个选项在实际中如何设置:
先来看一下三个参数的定义:

options: L,

其中,L为:

L: Borrow<[T]> + 'a, 

T:

T: ToString + PartialEq + Clone,

此处,T是泛型,官方定义加了约束,T是可以复制且能转为字符并且可比较的类型。而L是T的借用,且生命周期一致。

selected: Option<V>,

selected是枚举,枚举的类型是V:

V: Borrow<T> + 'a,

与options不同的是,V借用T,而L借用的是数组[T].

on_select: Box<dyn Fn(T) -> Message + 'a>, 

on_select是和事件绑定的,是消息的触发,它被定义为一个指针,指向的是pick_list的选项,并接收反馈的消息内容。综合起来,Box<dyn Fn(T) -> Message + 'a> 表示一个指向实现了Fn(T) -> Message trait的对象的堆上分配的智能指针,且这个对象的生命周期至少为’a。
以上是关于官方定义的解释,下面我们来看一下实际应用。

pick_list(&Item::ALL[..],self.selected_item,Message::ItemSelected)           

此处,&Item::ALL[…]对应的是options,selected对应的是self.selected_item,而on_select对应的是Message::ItemSelected。
分别来看一下各个变量是如何创建的。

先创建了枚举Item,此处为其添加了Default特性。

#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]  
enum Item{#[default]Rust,Elm,Ruby,Haskell,C,JS,Other,}

然后,Item作为pick_list的选项的数据,其必须符合定义时泛型T的定义:

T: ToString + PartialEq + Clone, 

T可以转为字符,所以,我们需要为Item实现Display特性:

impl std::fmt::Display for Item{      fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {write!(f,"{}",match self{Item::Rust => "Rust",Item::Elm => "Elm",Item::Ruby => "Ruby",Item::Haskell => "Haskell",Item::C => "C",Item::JS => "Javascript",Item::Other => "Other",})}
}

Display可以很方便的设置参数转为字符的格式化设置。
而为了使Item的选项能够作为数组[T]传入options,需要将Item实现数组定义:

impl Item{    const ALL:[Item;7]=[Item::Rust,Item::Elm,Item::Ruby,Item::Haskell,Item::C,Item::JS,Item::Other,];
}

此处定义了一个常量ALL,ALL包含了Item的所有项,且是数组。
而selected的参数selected_item 则定义在结构体中:

struct Example{ value:i64,value_sld:f32,value_sld2:f32,default:f32,step:f32,shift_step:f32,selected_item:Option<Item>,
}

注意selected_item的类型是枚举。
而on_select的参数则是消息:

#[derive(Debug,Clone,Copy)]
enum Message{Clicked,SliderChanged(f32),ItemSelected(Item),
}

这样一来,Item中定义的项,将会按照Display设置的显示格式,显示在下拉列表中:
在这里插入图片描述
当我们选择其中一项时,会触发on_select,此时,选中的项的内容将作为消息传递给Message::ItemSelected(Item),其中item就是选中项。
我们只需要在update函数中处理消息即可:

  fn update(&mut self,message:Message){      match message{Message::Clicked => {self.value +=1;}    Message::SliderChanged(value)=>{self.value_sld=value;}Message::ItemSelected(item)=>{self.selected_item=Some(item);println!("{:?}",item);}}}

可以看到,我们将选中项作为值赋给了变量selected_item,也就是只要我们选择任何项,selected_item都会跟随改变,也就是下拉列表选择完成后显示的就是我们选择的项。
我们也可以将selected_item 赋予其他部件,如text,这样我们选择什么项,就可以在UI上显示出来:
在这里插入图片描述  
综上,我们已经基本了解了pick_list作为小部件是如何定义和使用的,其属性和参数又是如何设置的。
下面看一下动态演示:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Objective-C大爆炸:从零到单例模式

oc学习笔记&#xff08;一&#xff09; 文章目录 oc学习笔记&#xff08;一&#xff09;oc与c语言的区别#import的用法foundation框架NSLog函数NSString类型符号的作用oc中的数据类型 类与对象概念&#xff1a; 创建第一个类类的定义类的实现类加载对象的产生和使用 self语法id…

最新springboot家乡特色推荐系统

采用技术 最新springboot家乡特色推荐系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能 系统首页 用户注册 文章分享 个人中心 管理员模…

经典文献阅读之--EarlyBird(用于BEV中多视图跟踪的早期融合)

0. 简介 多视角聚合技术有望克服多目标检测和跟踪中的遮挡和漏检问题。最近的多视角检测和三维物体检测方法通过将所有视角投影到地面平面上&#xff0c;并在鸟瞰图中进行检测&#xff0c;取得了巨大的性能提升。《EarlyBird: Early-Fusion for Multi-View Tracking in the Bi…

Servlet(三个核心API介绍以及错误排查)【二】

文章目录 一、三个核心API1.1 HttpServlet【1】地位【2】方法 1.2 HttpServletRequest【1】地位【2】方法【3】关于构造请求 1.3 HttpServletResponse【1】地位【2】方法 四、涉及状态码的错误排查&#xff08;404……&#xff09;五、关于自定义数据 ---- body或query String …

计算机网络 备查

OSI 七层模型 七层模型协议各层实现的功能 简要 详细 TCP/IP协议 组成 1.传输层协议 TCP 2.网络层协议 IP 协议数据单元&#xff08;PDU&#xff09;和 封装 数据收发过程 数据发送过程 1. 2.终端用户生成数据 3.数据被分段&#xff0c;并加上TCP头 4.网络层添加IP地址信息…

nuxt3使用记录五:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为&#xff0c;今天我突然很好奇&#xff0c;我发现之前构建的自动产生的200.html和404.html足足290k&#xff0c;怎么这么大呢&#xff1f;不是很占用我带宽&#xff1f; 一个啥东西都没有的静态页面&#xff0c;凭啥这么大&#xff01;所以我就想着手动把他…

Github Action Bot 开发教程

Github Action Bot 开发教程 在使用 Github 时&#xff0c;你可能在一些著名的开源项目&#xff0c;例如 Kubernetes&#xff0c;Istio 中看到如下的一些评论&#xff1a; /lgtm /retest /area bug /assign xxxx ...等等&#xff0c;诸如此类的一些功能性评论。在这些评论出现…

Django-基础篇

Django是一个开放源代码的Web应用框架&#xff0c;由Python语言编写。它遵循MVC&#xff08;Model-View-Controller&#xff09;的软件设计模式&#xff0c;使开发者能够以高效、可扩展和安全的方式构建Web应用程序。 Django具有以下特点和优势&#xff1a; 强大的功能&#x…

面试笔记——线程池

线程池的核心参数&#xff08;原理&#xff09; public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)corePoolSize …

利用word2vec包将中文转变为词向量

代码展示&#xff1a; import jieba import re import json import logging import sys import gensim.models as word2vec from gensim.models.word2vec import LineSentence, loggerpattern u[\\s\\d,.<>/?:;\\"[\\]{}()\\|~!\t"#$%^&*\\-_a-zA-Z&…

C#创建obj三维模型文件

介绍 使用开源库创建obj三维模型文件。 开源库地址&#xff1a;https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj 相关API地址&#xff1a;https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html …

【docker】开放Docker端口

【docker 】 安装docker&#xff08;centOS7&#xff09;-CSDN博客 【docker】常用命令-CSDN博客 【docker】centos7配置docker镜像加速_docker仓库加速地址-CSDN博客 【docker】Hello World-CSDN博客 【docker 】Compose 使用介绍_docker compose 使用-CSDN博客 【docker…

linux(ubuntu18.04.2) Qt编译 MySQL(8.0以上版本)链接库 Qt版本 5.12.12及以上 包含Mysql动态库缺失问题

整理这篇文档的意义在于&#xff1a;自己走了很多弯路&#xff0c;淋过雨所以想为别人撑伞&#xff0c;也方便回顾&#xff0c;仅供参考 一、搭建开发环境&#xff1a; 虚拟机&#xff08;ubuntu-20.04.6-desktop-amd64&#xff09;&#xff1a;Mysql数据库 8.0.36Workbench …

tidb离线本地安装及mysql迁移到tidb

一、背景&#xff08;tidb8.0社区版&#xff09; 信创背景下不多说好吧&#xff0c;从资料上查tidb和OceanBase“兼容”&#xff08;这个词有意思&#xff09;的比较好。 其实对比了很多数据库&#xff0c;有些是提供云服务的&#xff0c;有些“不像”mysql&#xff0c;综合考虑…

【如何使用SSH密钥验证提升服务器安全性及操作效率】(优雅的连接到自己的linux服务器)

文章目录 一、理论基础&#xff08;不喜欢这部分的可直接看具体操作&#xff09;1.为什么要看本文&#xff08;为了zhuangbility&#xff09;2.为什么要用密钥验证&#xff08;更安全不易被攻破&#xff09;3.密码验证与密钥验证的区别 二、具体操作1.生成密钥对1.1抉择&#x…

计算机复试项目:SpringCloud实战高并发微服务架构设计

秒杀购物商城--环境搭建 秒杀购物商城基础服务组件--详细介绍 秒杀购物商城基础服务--权限中心 秒杀购物商城业务服务--收货地址 秒杀购物商城业务服务--秒杀活动服务 秒杀购物商城--购物车的功能设计及分析 秒杀购物商城基础服务-用户中心 秒杀购物商城业务服务--商品中…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之九 简单进行嘴巴检测并添加特效的功能实现 一、简单介绍 二、简单…

ArcGIS小技巧—模型构建器快速提取河网

上篇文章介绍的基于DEM的河网提取&#xff0c;需要使用多个工具&#xff0c;整体操作比较繁琐&#xff0c;在日常工作中&#xff0c;使用Arcgis提供的模型构建器可以帮助我们将多个工具整合在一起&#xff0c;在面对大量数据批量处理时&#xff0c;可以大大提高工作效率 利用模…

数字化wms仓库管理软件,实现企业仓储信息共享与智慧运行-亿发

在经济飞速发展的今天&#xff0c;企业面临着客户需求多样化、质量和交期要求提高以及激烈的市场竞争等挑战。在这样的背景下&#xff0c;许多企业开始考虑采用数字化仓储WMS系统来解决这些问题。 数字化仓储WMS系统通过打造高效、规范的仓库管理体系&#xff0c;实现了对产品…

爱普生晶振在物联网LoRa通讯中的应用

LoRa 是LPWAN通信技术中的一种&#xff0c;是美国Semtech公司采用和推广的一种基于扩频技术的超远距离无线传输方案。这一方案改变了以往关于传输距离与功耗的折衷考虑方式&#xff0c;为用户提供一种简单的能实现远距离、长电池寿命、大容量的系统&#xff0c;进而扩展传感网络…