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.rhkb.cn/news/315291.html

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

相关文章

Redis中的慢查询日志(一)

慢查询日志 概述 Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求&#xff0c;用户可以通过这个功能产生的日志来 监视和优化查询速度。服务器配置有两个和慢查询日志相关的选项: 1.slowlog-log-slower-than选项指定执行时间超过多少微妙(1秒1000 000微妙)的命…

【精】DevOps实战学习CI/CD落地方案#CI篇#

目录 先有个大概了解 基本概念 CI/CD Devops 阿里云效 devops产品 K8s jenkins docker git maven 知行合一&#xff0c;上手操作 实操记录 安装VMware 安装并配置虚拟机 安装并配置docker docker安装 修改镜像源&#xff08;关键且易出错&#xff09; CentOS…

低代码信创开发核心技术(四)动态元数据系统设计

一、概述 在当今快速发展的信息技术领域&#xff0c;动态元数据系统扮演着至关重要的角色。它不仅能够提供数据的描述信息&#xff0c;还能动态地适应业务需求的变化&#xff0c;从而提高系统的灵活性和可扩展性。构建一个动态元数据系统意味着我们可以在不重启系统的情况下&a…

Facebook的未知力量:数字世界的新引擎

在数字化的时代&#xff0c;社交媒体已经成为了我们日常生活中不可或缺的一部分&#xff0c;而Facebook作为其中的巨头&#xff0c;其影响力远远超出了我们的想象。但是&#xff0c;Facebook背后隐藏的力量和影响远不止于此&#xff0c;它正逐渐成为数字世界的新引擎&#xff0…

书生·浦语 大模型(学习笔记-5)XTuner 微调 LLM:1.8B、多模态、Agent

目录 一&#xff1a;两种微调 二、数据的一生 三、微调方案 四、XTuner 五、InternLM2 1.8B模型&#xff08;相关知识&#xff09; 一&#xff1a;两种微调 增量与训练和指令微调的区别 二、数据的一生 原始数据转换为标准格式数据 添加对话模板&#xff0c;直接调用即可…

操作系统课程--考纲要求

第一/二次课&#xff1a; 绪论 【学习内容与目标】 1、操作系统目标及定义 掌握操作系统的设置目标&#xff0c;理解并掌握操作系统的定义&#xff0c;了解操作系统的地位以及从资源管理者角度和用户角度了解操作系统的组成。 2、 操作系统的特征与功能 掌握操作系统的特征&…

github Copilot的使用总结

1. 代码建议和补全 GitHub Copilot 的基本使用涉及编写代码时的实时代码建议和补全。一旦你已经安装并配置好 GitHub Copilot 插件&#xff0c;你可以在支持的编辑器&#xff08;如 Visual Studio Code&#xff09;中开始使用 Copilot。以下是一些基本的使用步骤&#xff1a; …

RK3588S和ARM阵列服务器在虚拟化云平台的应用

RK3588是瑞芯微2021年底推出的首款高端8nm旗舰芯片&#xff0c;而RK3588S 则是针对消费端市场在RK3588基础上缩减了部分外围接口&#xff0c;CPU、GPU和NPU等主要参数得到了保留&#xff0c;主要应用范围为高端ARM平板、ARM笔电产品&#xff0c;会议平板类、ARM服务器、智能机器…

信息系统项目管理师——第7章项目立项管理

本章考选择题2-3分&#xff0c;案例和论文均有可能作为领域考试。 项目建议与立项申请♥♥♥♥♥ 立项申请的概念 立项申请又称为项目建议书&#xff0c;是项目建设单位向上级主管部门提交项目申请时所必须的文 件&#xff0c;是该项目建设筹建单位根据国民经济的发展、国家…

JavaWeb过滤器

Javaweb过滤器是一种用于在Servlet处理请求之前或之后对请求进行预处理或后处理的组件。过滤器可以用于拦截请求、修改请求参数、过滤响应内容等操作。其主要作用包括&#xff1a; 拦截请求&#xff1a;过滤器可以拦截客户端请求&#xff0c;对请求进行验证、过滤或修改&#x…

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数&#xff1a; -Xss&#xff1a;每个线程的栈大小(单位kb)-Xms&#xff1a;堆的初始大小&#xff0c;默认物理内存的1/64,示例&#xff1a;-Xms:4g -Xms:10m-Xmx&#xff1a;堆的最大可用大小&#xff0c;默认物…

水库大坝安全白蚁监测系统解决方案

一、系统背景 白蚁作为河岸生态系统中的重要病害&#xff0c;不仅会导致水库大坝外部环境发生改变&#xff0c;甚至会引发水库大坝破坏&#xff0c;进而导致自身结构失去稳定性&#xff0c;严重影响水库大坝的正常运行。因此&#xff0c;治理水库大坝白蚁是确保水库大坝工程顺利…

HTTP与HTTPS 对比,区别详解(2024-04-25)

一、简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上&#xff0c;通常使用端口 80。 HTTPS&#xf…

【Hadoop】- MapReduce YARN 初体验[9]

目录 提交MapReduce程序至YARN运行 1、提交wordcount示例程序 1.1、先准备words.txt文件上传到hdfs&#xff0c;文件内容如下&#xff1a; 1.2、在hdfs中创建两个文件夹&#xff0c;分别为/input、/output 1.3、将创建好的words.txt文件上传到hdfs中/input 1.4、提交MapR…

区块链技术与应用学习笔记(8-9节)——北大肖臻课程

目录 8.挖矿 对于全节点和轻节点思考问题&#xff1f; ①全节点在比特币的主要作用&#xff1f; ②挖矿时当监听到别人已经挖出区块并且延申了最长合法链此时应该立刻放弃当前区块在 本地重新组装一个指向最后这个新合法区块的候选区块&#xff0c;重新开始挖矿。节点这么做…

「React Native」为什么要选择 React Native 作为的跨端方案

文章目录 前言一、常见因素二、举个栗子2.1 项目背景2.2 为什么选择 React Native2.3 项目实施2.4 成果总结 前言 没有完美的跨端技术&#xff0c;只有适合的场景。脱离适用场景去谈跨端技术没有什么意义。 一、常见因素 共享代码库&#xff1a; React Native 允许开发者编写…

OmniPlan Pro for Mac v4.8.0中文激活版 项目流程管理工具

OmniPlan Pro for Mac是一款功能强大的项目管理软件&#xff0c;它以其直观的用户界面和丰富的功能&#xff0c;帮助用户轻松管理各种复杂的项目。 OmniPlan Pro for Mac v4.8.0中文激活版 通过OmniPlan Pro&#xff0c;用户可以轻松创建任务&#xff0c;设置任务的开始和结束时…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

系统安全测试要怎么做?

进行系统安全测试时&#xff0c;可以按照以下详细的步骤进行&#xff1a; 1、信息收集和分析&#xff1a; 收集系统的相关信息&#xff0c;包括架构、部署环境、使用的框架和技术等。 分析系统的安全需求、威胁模型和安全策略等文档。 2、威胁建模和风险评估&#xff1a; …

【VUE】Vue中实现树状表格结构编辑与版本对比的详细技术实现

Vue中实现树状表格结构编辑与版本对比的详细技术实现 在Vue中&#xff0c;创建一个可编辑的树状表格并实施版本对比功能是一种需求较为常见的场景。在本教程中&#xff0c;我们将使用Vue结合Element UI的el-table组件&#xff0c;来构建一个树状表格&#xff0c;其中包含添加、…