前言
本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。
iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1.
概述
这是本专栏的第四篇,主要讲述单选框按钮radio部件的使用,会结合实例来说明。
系列博客链接:
1、RustGUI学习(iced)之小部件(一):如何使用按钮和文本标签部件
2、RustGUI学习(iced)之小部件(二):如何使用滑动条部件
3、RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?
环境配置:
系统:windows
平台:visual studio code
语言:rust
库:iced
注:iced是一个受Elm启发而编写,适用于rust语言的跨平台的GUI库。
本篇内容:
1、radio
单选框部件
单选框部件radio在iced中的定义如下:
/// Creates a new [`Radio`].
///
/// [`Radio`]: crate::Radio
pub fn radio<Message, Theme, Renderer, V>(label: impl Into<String>,value: V,selected: Option<V>,on_click: impl FnOnce(V) -> Message,
) -> Radio<Message, Theme, Renderer>
whereMessage: Clone,Theme: radio::StyleSheet,Renderer: core::text::Renderer,V: Copy + Eq,
{Radio::new(label, value, selected, on_click)
}
其由Radio来创建:
#[allow(missing_debug_implementations)]
pub struct Radio<Message, Theme = crate::Theme, Renderer = crate::Renderer>
whereTheme: StyleSheet,Renderer: text::Renderer,
{is_selected: bool,on_click: Message,label: String,width: Length,size: f32,spacing: f32,text_size: Option<Pixels>,text_line_height: text::LineHeight,text_shaping: text::Shaping,font: Option<Renderer::Font>,style: Theme::Style,
}
我们来看一下radio部件的参数和属性,其中项width、text_size之类的属性我们将不再赘述,主要看一下radio部件主要的参数:
1、label是字符类型,表示单选框的名称,
2、is_selected:布尔量,它是一个比较结果:
is_selected: Some(value) == selected,
其中value是当前radio的预设值,将其与实时值比较,以判定当前radio是否被选中。
3、on_click:用于监听radio是否被选中,若选中,则触发消息。其反馈值包含当前选中的是哪个radio值。
简单的说一下外观样式的自定义:
和之前所说的部件类似,radio部件如果要自定义样式,需要先创建自定义结构体样式:
//自定义radio样式1
struct MyRadioStyle;
然后实现StyleSheet:
impl radio::StyleSheet for MyRadioStyle { type Style = Theme;fn active(&self, style: &Self::Style, is_selected: bool) -> radio::Appearance {radio::Appearance { background: Background::Color(Color::from_rgb8(180, 184, 248)), dot_color: Color::from_rgb8(252, 29, 29), border_width:1.0, border_color: Color::BLACK, text_color:Some(Color::BLACK),}}fn hovered(&self, style: &Self::Style, is_selected: bool) -> radio::Appearance {radio::Appearance { background: Background::Color(Color::from_rgb8(126, 241, 132)), dot_color: Color::from_rgb8(252, 29, 29), border_width: 1.0, border_color: Color::BLACK, text_color: Some(Color::BLACK),}}
}
其效果如下:
下面来看一下实际使用,一般来说,单选框至少是成对出现,否则单选框就失去了意义。本例中我们假设有4个单选框为1组,我们先创建一个枚举如下:
#[derive(Debug,Clone,Copy,PartialEq,Eq)]
pub enum Choise{ A,B,C,All,
}
这个Choise枚举包含A、B、C、All四个选项,将会分别对应四个单选框。
然后我们在Message枚举中添加一个项:
RadioChose(Choise),
RadioChose消息的内部参数是Choise枚举。
因为radio的参数中还有一个selected值,其定义为:
selected: Option<V>,
所以,我们在结构体中新建变量:
select_choise:Option<Choise>,
新变量select_choise是一个枚举类型,参数是Choise枚举。
然后我们将创建4个radio部件:
radio("A", Choise::A, self.select_choise, Message::RadioChose).width(6).size(15).spacing(4), radio("B",Choise::B, self.select_choise, Message::RadioChose).width(6).size(15).spacing(4),radio("C",Choise::C, self.select_choise, Message::RadioChose).width(6).size(15).spacing(4),radio("All",Choise::All, self.select_choise, Message::RadioChose).width(6).size(15).spacing(4),
可以看到其格式都是相同的,我们选取其中一个来做说明。
radio("A", Choise::A, self.select_choise, Message::RadioChose).width(6).size(15).spacing(4),
如上代码,其中字符串“A”表示radio的名称,即label属性。
而Choise::A对应的是value属性,即当前radio的值。
而select_choise则表示实时值,它会根据所选择的不同radio来改变,其改变逻辑在update函数中实现。
最后,Message::RadioChose表示消息触发。
当我们选择4个单选框中的任何一个时,都会触发消息Message,Message会反馈当前选择的radio值,我们在update中处理这个值:
Message::RadioChose(choise)=>{self.select_choise=Some(choise);}
即将触发产生的radio实时值传递给select_choise,这样UI就会更新当前radio选中项。
以上就是单选框部件radio的使用介绍,相对来说,radio的使用比较简单,我们来看一下动态演示: