学习 Rust GUI iced

前言

最近学习 Rust GUI, 就记录下学 iced 的一些简单代码,代码也上传到了 GitHub,想看完整代码,可直接下载即可。(字体报错找不到,是因为字体十几M太了,所以没放上去,大家随便找个可以显示中文字体的放上去就行了)

用 iced 的版本是 0.3
这个是官方的一些例子,有兴趣可以看一下 https://github.com/hecrj/iced/tree/master/examples

Demo App 的界面


在这里插入图片描述

Font

以下的 XQFONT 均指该 XQFONT

const XQFONT: Font = Font::External {
    name: "方正字体",
    bytes: include_bytes!("source/FZKT_Document.TTF"), // 用 include_bytes 如果路径错误,会提示的
};

Text

文本

let text = Text::new("我是 Text")
        .size(100) // 字体大小
        .height(Length::Units(100)) // 高度(默认自适应)
        .width(Length::Units(200)) // 宽度(默认自适应)
        .color(Color::new(0.2, 0.8, 0.2, 1.0)) // 字颜色
        .font(XQFONT) // 字体, XQFONT 是我自定义的字体
        .vertical_alignment(VerticalAlignment::Center) // 字纵向的排列
        .horizontal_alignment(HorizontalAlignment::Center) // 字横向的排列

Button

按钮

let button = Button::new(&mut self.button_state, Text::new("Touch me!(Button)"))
            .on_press(HelloMessage::Button) // 点击发出 message
            .min_width(250) // 最小宽度
            .min_height(60) // 最小高度
            .padding(20) // 内间距
            ;

CheckBox

复选框

let check_box = Checkbox::new(self.is_checked, "CheckBox", HelloMessage::CheckBox)
        .size(30) // 框大小
        .spacing(10) // 框和字的间距
        .text_size(30) // 字大小

Radio

单选按钮

let radio = Radio::new(
            true,
            "Radio".to_string(),
            Option::Some(self.radio_value),
            HelloMessage::Radio,
        )
        .size(30) // 框大小
        .text_size(30) // 字大小
        .spacing(10) // 框和字的间距

TextInput

输入框

let text_input = TextInput::new(
            &mut self.input_state,
            "placeholder",
            &self.input_str,
            HelloMessage::TextInput,
        )
        .on_submit(HelloMessage::TextInputSubmit) // 用户按下回车, 发送消息
        .padding(10) // 内间距
        .password() // 变成密码类型输入框

Slider

滑条

let slider = Slider::new(
            &mut self.slider_state,
            RangeInclusive::new(0, 100),
            self.slider_value,
            HelloMessage::Slider,
        )
        .step(2) // 一次跳转多少
        .on_release(HelloMessage::SliderRelease) // 放开 Slider 通知
        ;

ProgressBar

进度条

let progress_bar =
            ProgressBar::new(RangeInclusive::new(0.0, 100.0), self.slider_value as f32);

PickList

选择列表

let pick_list_option = vec![String::from("111"), String::from("222")];
let cow = Cow::Owned(pick_list_option);
let pick_list = PickList::new(
            &mut self.pick_list_state,
            cow,
            Option::Some(self.pick_list_str.clone()),
            HelloMessage::PickList,
        )
        .padding(10) // 内间距
        .text_size(30) // 文字大小

Rule

线

// Rule::vertical(spacing) 是竖线
let rule = Rule::horizontal(30);

Tooltip

提示

let tooltip = Tooltip::new(
            Text::new("移动到我这里,会出现 Tooltip").font(XQFONT),
            "我是 Tooltip",
            tooltip::Position::Top,
        )
        .gap(10) // 和 content 的距离
        .font(XQFONT) // 字体
        .padding(10) // 提示内间距
        .size(30) // 提示字大小

Scrollable

滚动视图

let scrollable = Scrollable::new(&mut self.scrollable_state)
            .push(column) // 添加控件
            .scrollbar_margin(100) // 滚动条间距
            .scrollbar_width(50) // 滚动条背景宽度
            .scroller_width(40) // 滚动条宽度
            .padding(16) // 内间距
            .spacing(12) // 每个控件的间距
            .max_height(1000000) // 最大高度
            .max_width(1000000) // 最大宽度

Row

行布局

let row = Row::new()
            .push(text)
            .padding(16) // 内间距
            .spacing(12) // 每个控件的间距
            .align_items(Align::Start) // 布局对齐方式,默认就是start
            .max_height(1000000) // 最大高度
            .max_width(1000000) // 最大宽度

Column

列布局

let column = Column::new()
            .push(text)
            .padding(16) // 内间距
            .spacing(12) // 每个控件的间距
            .align_items(Align::Start) // 布局对齐方式,默认就是start
            .max_height(1000000) // 最大高度
            .max_width(1000000) // 最大宽度

PaneGrid

网格布局

let pane_grid = PaneGrid::new(&mut self.pane_grid_state, |_, state| {
            // 根据枚举不同,创建不同的控件
            pane_grid::Content::new(match state {
                PaneState::Vertical => Text::new("我是 pane0, 点我纵向切割").font(XQFONT),
                PaneState::Horizontal => Text::new("我是 pane1, 点我横向切割").font(XQFONT),
            })
        })
        .on_drag(HelloMessage::PaneDragged) // 拖动事件
        .on_resize(10, HelloMessage::PaneResized) // 刷新布局事件
        .on_click(HelloMessage::PaneClick) // 点击事件
        .height(Length::Units(500))
        .spacing(10) // 控件间距

觉得有帮助就点个赞吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336