RustGUI学习(iced)之小部件(二):如何使用滑动条部件

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

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

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

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

本篇内容:
1、slider

滑动条部件

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

/// Creates a new [`Slider`].
///
/// [`Slider`]: crate::Slider
pub fn slider<'a, T, Message, Theme>(range: std::ops::RangeInclusive<T>,value: T,on_change: impl Fn(T) -> Message + 'a,
) -> Slider<'a, T, Message, Theme>
whereT: Copy + From<u8> + std::cmp::PartialOrd,Message: Clone,Theme: slider::StyleSheet,
{Slider::new(range, value, on_change)
}

其由Slider来创建:

#[allow(missing_debug_implementations)]
pub struct Slider<'a, T, Message, Theme = crate::Theme>     
whereTheme: StyleSheet,
{range: RangeInclusive<T>,step: T,shift_step: Option<T>,value: T,default: Option<T>,on_change: Box<dyn Fn(T) -> Message + 'a>,on_release: Option<Message>,width: Length,height: f32,style: Theme::Style,
}

从上面可以看到,slider包含有以上属性或者方法,我们一一来看一下。
range表示的是滑动条的范围,即最小和最大值。
step表示滑动条滑动的最小单位,即拖动时slider值改变的最小值。
shift_step表示当按下shift键时拖动滑动条的最小值。
value表示滑动条当前值。
defualt表示默认值,或者初始值。
on_change表示滑动条滑动时触发。
on_release表示滑动条释放时触发。
width、height表示宽、高。
style表示滑动条的样式,有默认和自定义可选。

我们先来看一下slider实际应用:

 slider(1.0..=40.0, self.value_sld,Message::SliderChanged).default(self.default) .step(self.step).shift_step(self.shift_step).width(100).style(style8),

如上代码,range为1.0…=40.0,这种表示方式,表示最小为1,最大为40.需要注意的是数据格式,range、value包括step等都需要保持一致,如此处是f32.
此处的value为self.value_sld,来自于自定义的struct:

struct Example{             value:i64,value_sld:f32,default:f32,step:f32,shift_step:f32,
}

on_change则绑定了enum的message:

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

即每当滑动条滑动时,都会将当前滑动条的值传入SliderChanged(f32)中,我们只需要在iced的update函数中去处理这个值即可。

 Message::SliderChanged(value)=>{self.value_sld=value;}

将滑动条的内部值传递给value_sld,value_sld表示滑块的实时位置,这样,拖动时,滑块就可以跟踪鼠标实时滑动。
default、step和shift_step只需要将前面定义好的值填入即可:

struct Example{   value:i64,value_sld:f32,value_sld2:f32,default:f32,step:f32,shift_step:f32,
}

width用于设置滑动条的宽度,可以使用预设,也可以自定义值,无需多说。
主要说一下style,即滑动条的样式设置。前面说过,style有默认和自定义两种可选,先来看一下默认样式:

let style8=theme::Slider::Default; 

看一下实际效果:
在这里插入图片描述
默认样式看起来也不错,如果不满足于默认样式,那么可以使用自定义,和我们在前一篇中说到的按钮的样式自定义一样,如果要对slider进行自定义,也需要对其实现StyleSheet这个特性,只不过按钮时button style,而此处是slider style。

我们来看下slider的StyleSheet:

/// A set of rules that dictate the style of a slider.    
pub trait StyleSheet {/// The supported style of the [`StyleSheet`].type Style: Default;/// Produces the style of an active slider.fn active(&self, style: &Self::Style) -> Appearance;/// Produces the style of an hovered slider.fn hovered(&self, style: &Self::Style) -> Appearance;/// Produces the style of a slider that is being dragged.fn dragging(&self, style: &Self::Style) -> Appearance;
}

和按钮的样式差不多,有一些区别在于其触发事件,slider没有press,而是dragging,即拖拽。
再来看下slider的外观Appearance:

/// The appearance of a slider. 
#[derive(Debug, Clone, Copy)]
pub struct Appearance {/// The colors of the rail of the slider.pub rail: Rail,/// The appearance of the [`Handle`] of the slider.pub handle: Handle,
}

可以看到,slider的外观属性分为两方面,一个是rail,一个是handle,即滑动轨道和滑动块,可以分别设置。
其中:rail:

/// The appearance of a slider rail      
#[derive(Debug, Clone, Copy)]
pub struct Rail {/// The colors of the rail of the slider.pub colors: (Color, Color),/// The width of the stroke of a slider rail.pub width: f32,/// The border radius of the corners of the rail.pub border_radius: border::Radius,
}

对于rail即滑动轨道,可以设置其前景色、背景色,轨道粗细以及轨道圆角。

handle:

/// The appearance of the handle of a slider.  
#[derive(Debug, Clone, Copy)]
pub struct Handle {/// The shape of the handle.pub shape: HandleShape,/// The [`Color`] of the handle.pub color: Color,/// The border width of the handle.pub border_width: f32,/// The border [`Color`] of the handle.pub border_color: Color,
}

对于handle即滑块,可以设置滑块形状、颜色、边框粗细以及颜色,这其中滑块形状又可以设置:

/// The shape of the handle of a slider. 
#[derive(Debug, Clone, Copy)]
pub enum HandleShape {/// A circular handle.Circle {/// The radius of the circle.radius: f32,},/// A rectangular shape.Rectangle {/// The width of the rectangle.width: u16,/// The border radius of the corners of the rectangle.border_radius: border::Radius,},
}

可以选择圆形,也可以选择方形。
综上所述,滑动条的外观可调整性还是很强的,无论是形状、颜色、大小以及圆角半径都可以自定义。
接下来我们看下如何自定义滑动条的样式:
1、新建样式结构体

//自定义slider样式1
struct MySliderStyle; 

2、实现StyleSheet

impl slider::StyleSheet for MySliderStyle { type Style = Theme;//激活时外观fn active(&self, style: &Self::Style) -> slider::Appearance {slider::Appearance { rail: Rail{colors:(Color::from_rgb8(20, 48, 210),Color::from_rgb8(151, 155, 175)),width:5.0,border_radius:[3.0;4].into(),}, handle: slider::Handle{shape:HandleShape::Rectangle { width: 8, border_radius: [2.0;4].into() },color:Color::from_rgb8(13, 248,44),border_width:1.0,border_color:Color::BLACK,}}}//悬停时外观fn hovered(&self, style: &Self::Style) -> slider::Appearance {slider::Appearance { rail: Rail{colors:(Color::from_rgb8(20, 48, 210),Color::from_rgb8(151, 155, 175)),width:5.0,border_radius:[3.0;4].into(),}, handle: slider::Handle{shape:HandleShape::Rectangle { width: 8, border_radius: [2.0;4].into()},color:Color::from_rgb8(176, 171,186),border_width:1.0,border_color:Color::BLACK,}}}//拖拽时外观fn dragging(&self, style: &Self::Style) -> slider::Appearance {slider::Appearance { rail: Rail{colors:(Color::from_rgb8(20, 48, 210),Color::from_rgb8(151, 155, 175)),width:5.0,border_radius:[3.0;4].into(),}, handle: slider::Handle{shape:HandleShape::Rectangle { width: 8, border_radius: [2.0;4].into() },color:Color::from_rgb8(13, 248,44),border_width:1.0,border_color:Color::BLACK,}}}
}

看一下自定义的效果:
在这里插入图片描述
和默认的放一起对比下:
在这里插入图片描述
区别还是很明显的,也可以将滑动块设置为圆形,关于样式就差不多了。

接下来说一下本例中slider的应用,即拖动slider时,其值改变,实时值会在下方的文本text中显示,同时,对滑动条的值进行转换,作为上方text的尺寸倍率,即拖动slider时,上方文本的大小会随之改变,看一下实际效果:
在这里插入图片描述
这里的实现也很简单,即获取slider的实时值后,将其进行转换,然后将转换的倍率和text文本的size值相乘即可:

let scale1=self.value_sld /20.0;let size1=15.0*scale1;
text(format!("value:{}",self.value)).size(size1).shaping(Shaping::Advanced)   .horizontal_alignment(alignment::Horizontal::Center).vertical_alignment(alignment::Vertical::Center).width(40).height(40).style(style7),

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

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

相关文章

基于springboot+vue的民法普及系统的设计与实现

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要请联系

kafka部分partition的leader=-1修复方案整理

kafka部分partition的leader-1修复方案整理 1. 背景说明2. 修复测试2.1 创建正常的topic并验证生产和消费2.2 停止kafka模拟leader-12.3 修复parition2.4 修复完成验证生产消费是否恢复 3. 疑问和思考3.1 kafka在进行数据消费时&#xff0c;如果有partition的leader-1&#xff…

openEuler 22.03 LTS SP3(华为欧拉)一键安装 Oracle 11GR2 RAC(231017)

前言 Oracle 一键安装脚本&#xff0c;演示 openEuler 22.03 LTS SP3 一键安装 Oracle 11GR2 RAC&#xff08;231017&#xff09;过程&#xff08;全程无需人工干预&#xff09;&#xff1a;&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地…

【结构型模型】享元模式

一、享元模式概述 享元模式定义&#xff1a;又叫蝇量模式&#xff0c;运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象&#xff0c;而这些对象都很相似&#xff0c;状态变化很小&#xff0c;可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细…

备考2024年小学生古诗文大会:吃透10道历年真题和知识点(持续)

对上海小学生的小升初和各种评优争章来说&#xff0c;语文、数学、英语的含金量较高的证书还是很有价值和帮助的。对于语文类的竞赛&#xff0c;小学生古诗文大会和汉字小达人通常是必不可少的&#xff0c;因为这两个针对性强&#xff0c;而且具有很强的上海本地特色。 根据往…

IPEmotion轻松解决急停设备的控制与数据存储问题

一 背景 众所周知&#xff0c;急停操作在各种工业领域中都扮演着非常重要的角色。在一个个紧急情况下&#xff0c;及时采取急停操作可节省宝贵时间&#xff0c;避免人身伤害或设备损坏&#xff0c;降低安全风险&#xff0c;尤其是在新能源测试中&#xff0c;出于对高压电性能方…

C语言实现双人贪吃蛇项目(基于控制台界面)

一.贪吃蛇 贪吃蛇是一款简单而富有乐趣的游戏&#xff0c;它的规则易于理解&#xff0c;但挑战性也很高。它已经成为经典的游戏之一&#xff0c;并且在不同的平台上一直受到人们的喜爱和回忆。 二.贪吃蛇的功能 游戏控制&#xff1a;玩家可以使用键盘输入设备来控制蛇的移动方…

书生·浦语大模型开源体系(四)作业

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

云上如何实现 Autoscaling: AutoMQ 的实战经验与教训

01 背景 弹性是云原生、Serverless 的基础。AutoMQ 从软件设计之初即考虑将弹性作为产品的核心特质。对于 Apache Kafka 而言&#xff0c;由于其存储架构诞生于 IDC 时代&#xff0c;针对物理硬件设计&#xff0c;存储层强依赖本地存储&#xff0c;已不能很好地适应现在云的时…

求臻医学MRD产品斩获2023年度肿瘤标志物年度十大创新技术产品奖

2024年4月20日&#xff0c;中国肿瘤标志物学术大会开幕式暨名家讲坛在南京隆重召开! 会议期间&#xff0c;中国抗癌协会肿瘤标志专业委员会联合中国抗癌协会肿瘤临床检验与伴随诊断专业委员会、中国抗癌协会肿瘤基因诊断专业委员等共同发布“2023 年度肿瘤标志物创新技术产品”…

Day 32 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

买卖股票的最佳时期Ⅱ 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你…

Centos之yum安装好玩的命令

1.会动的小火车 我在root下使用的 yum install sl.x86_64sl2.figlet yum install figlet.x86_64figlet 55553.cowsay会说话 yum install cowsay