【Rust】Iced GUI库初使用及踩坑——写一个计数器

这篇具有很好参考价值的文章主要介绍了【Rust】Iced GUI库初使用及踩坑——写一个计数器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(该文写于去年8月份,目前iced更新到0.7已有些许API改动,本文内容已有部分错误,但仍有借鉴价值)

写在前面

从5月份起,我一直在寻找一个可用的,稳定的,开发者友好的Rust GUI框架,试图做到All in Rust,即一切的一切都可以靠Rust实现,其中GUI是相当重要的一部分,但找了许久,大部分给我答案是使用tauri,可我不是一个前端程序员,也没有深入学习前端的想法,故寻找计划只好搁置,直到9月份我发现PopOS团队使用Iced框架制作了发行版的桌面,证明该框架已经得到了生产的认证,于是我开始尝试使用Iced进行GUI的制作。

劝退警告

Iced 作为一款正在高速发展的框架,其API有极大的不确定性,用来自开发团队的话就是

Iced is currently experimental software.Iced moves fast and the master branch can contain breaking changes!

指不定啥时候你平时用着的API就没了,或者一个lib突然出现了极大的变化,导致之前的代码完全推翻,如果你能承受此风险,可以继续往下学习。我在接触这个框架是碰到了如下问题

  • 文档和crate实际使用时出现严重的不符合,当我试图在文档中搜索时,文档的结果和实际有较大出入
  • 文档和crate和官方示例有极大的出入,体现在一些库成员已经deprecated或者move到了别的子库中,以及rust本身的不断更新导致代码也有一定的差异。

Iced框架介绍

Iced是一个简单的,易于理解的,高度模块化的GUI框架,其整个框架可以被简单的描述为4点

  • 状态(State)
  • 消息(Messages)
  • 界面逻辑(View Logic)
  • 更新逻辑(Update Logic)

根据本人自己的使用体验,这4者之间大概的关系如下

rust语言自带gui库,rust,rust,开发语言,后端,ui

其中 view()中的控件布局逻辑会绑定应用结构体里的控件状态,这样在交互时也会改变控件的状态。
可以发现其实是很好理解的,使用逻辑十分分明,接下来将用本人结合官方的例子来具体说明。

Iced-rs相关链接:
github
API文档
crate.io主页

成果展示

rust语言自带gui库,rust,rust,开发语言,后端,ui

代码讲解

新建一个工程

进入命令行,输入

> cargo new counter
> cd counter

打开Cargo.toml,向dependencies中添加

iced = "0.4"

然后执行

cargo run

完成对crate的获取以及看到输出Hello,World

建立一个Iced应用

首先引入Iced库

use iced::widget::{button, Column, Text};
use iced::{ Element, Length, Sandbox, Settings};

当我们需要实现一个计数器时,我们先想想,他大概由哪几部分组成,首先计数,那么他需要一个文本控件来显示数字,既然要实现数字的变化,那么就需要有两个按钮来使他增加或减少。于是我们建立结构体

struct Counter {
    Value: i32,
    increment_button: button::State,
    decrement_button: button::State,
}

其中Value为计数器的计数值,剩余两个为两个按钮的状态,这样就完成了我们的应用的“建模”。

给大伙发两条信息

根据上面的框图我们知道,你得让程序知道你点击了按钮,那么我们就需要定义Message

#[derive(Debug, Clone, Copy)]
pub enum Message {
    IncementPressed,
    DecrementPressed,
}

将结构体转变为真正的iced应用

根据官方文档知道,我们要为结构体实现(implement)一些 trait 让其成为应用

impl Sandbox for counter {
    ...
}

fn new

这个比较好理解,实例化一个counter结构体

fn new() -> Self {
        Self {
            Value: 0,
            increment_button: button::State::new(),
            decrement_button: button::State::new(),
        }
    }

fn update

首先你需要告诉iced你的消息枚举叫啥名字,所以

type Message = Message;

注意!第一个Message是Sandbox trait中定义的,而后一个是你自己在上面定义的,注意区分!

然后书写更新逻辑

fn update(&mut self, message: Self::Message) {
        match message {
            Message::IncementPressed => {
                self.Value += 1;
            }
            Message::DecrementPressed => {
                self.Value -= 1;
            }
        }
    }

可以看到,当收到IncrementPressed消息时,结构体自身的Value就会 +1

fn view

这个便是书写界面布局和实例化控件的步骤了,直接上代码!

fn view(&mut self) -> Element<'_, Self::Message> {
        Column::new()
            .push(
                button::Button::new(&mut self.increment_button, Text::new("+"))
                    .on_press(Message::IncementPressed),
            )
            .push(Text::new(self.Value.to_string()).size(50))
            .push(
                button::Button::new(&mut self.decrement_button, Text::new("-"))
                    .on_press(Message::DecrementPressed),
            )
            .into()
    }

代码中,首先我实例化了一个Column控件,用来容纳按钮和文本控件,然后通过push将控件添加到Column中,注意控件的push顺序,会影响布局的顺序。最后的into()相当重要,他负责把Column转换为Element类型,否则编译不通过。

大功告成

最后在main中对结构体执行run函数即可

fn main() -> {
    Counter::run(Settings::default());
}

运行cargo run则会出现一个简单的计数器界面。

写在最后

这篇文章主要是为了加深我对Iced GUI框架的认识,将技术与思考细节记录下来,如果能够帮助到你,真是不胜荣幸
(不过在跑通这个例子前,我真的碰到了一堆莫名其妙的问题,才有了这份结晶,大概率能帮助减少碰壁的概率)文章来源地址https://www.toymoban.com/news/detail-592535.html

到了这里,关于【Rust】Iced GUI库初使用及踩坑——写一个计数器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用docker部署onlyoffice插件步骤及踩坑问题(win10/linux)

    最近公司系统插件从金格换成了OnlyOffice,需要重新安装部署,做个记录。 安装onlyoffice有两种方式,第一种是独立安装nginx、epel、PostgreSQL、RabbitMQ等依赖项,再安装OnlyOffice文档插件。此种方式较为繁琐,暂不赘述,附同事分享的文档在资源内。 第二种为docker安装部署,省心

    2024年02月05日
    浏览(46)
  • 【一起学Rust | 框架篇 | Frui框架】rust一个对开发者友好的GUI框架——Frui

    本次内容接上回《rust原生跨平台GUI框架——iced》,最近突然涌现出多个Rust的UI框架,真实令人兴奋,同时也突出了Rust的勃然生机,我将尽量为大家介绍Rust领域的UI框架,带大家体验Rust领域的好玩意儿。 Frui是一个对开发者相当友好的UI框架,它使得开发者构建用户界面变得

    2024年02月01日
    浏览(42)
  • oracle 重启步骤及踩坑经验

    oracle 重启步骤及踩坑经验 切换到oracle用户 关闭监听 杀掉oracle有关进程 登录数据库,关闭oracle数据库 重启监听 重启数据库 shutdown immediate 时可能比较久,此时不要着急退出,等待一会等他报错 重启oracle startup时一直卡在Database mounted 可以等一会,如果等了很久没报错就退出

    2024年02月06日
    浏览(39)
  • windows10部署OpenIM,及踩坑记录

    https://doc.rentsoft.cn/#/demo/server_deploy/windows 部署方式:源码部署 部署版本:Open-IM-Server-main、Open-IM-SDK-Core-2.3.3 部署环境:windows10 这个链接是官方整理的部署文档,但是按照官方文档的步骤部署完之后,demo跑不通,一路排查整理,终于跑通,在这里整理并记录此次的部署过程,

    2024年02月04日
    浏览(45)
  • Android录音功能的实现及踩坑记录

    最近接到个需求,不使用第三方SDK的情况下实现IM通讯,文字聊天已经通过MQTT实现,而语音功能目前想到的较好解决方案就是进行录音文件的上传下载。可能还有更好解决方案,但我目前没想到,有建议的小伙伴劳烦指导下。 前提 : 1、权限申请: 清单文件中加上: 对应读

    2024年02月22日
    浏览(51)
  • 加密组件Jasypt学习、实战及踩坑记录

    最近入职新公司,因几乎全部项目都使用到jasypt,故而初步学习记录下本文(持续更新)。 官网及GitHub给出的简介:使用简单,性能好,特性features非常丰富;支持 另,有个开源Jasypt-spring-boot组件,GitHub,集成Jasypt,方便Spring Boot开发者使用。 开发中最常见的场景就是对数据

    2023年04月16日
    浏览(41)
  • ElasticSearch 7.6.2版本集群搭建及踩坑

    服务器说明 本次演示采用三台RockyLinux 8.5版本服务器 服务器 IP 备注 es-master 172.16.7.11 主节点 es-node01 172.16.7.5 01节点 es-node02 172.16.7.13 02节点 内核版本 修改系统名 配置hosts 所有服务器配置一些/etc/hosts 安装JDK 创建用户 下载软件 ES中文社区下载连接: 挑一个自己觉得稳定的版本

    2023年04月27日
    浏览(57)
  • Rust UI开发(四):iced中如何添加菜单栏(串口调试助手)

    注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 这是一个系列博文,本文是第四篇,前三篇链接: 1、Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符 2、Rust UI开发(二):iced中如何为窗口添加icon图标 3、Rust

    2024年02月03日
    浏览(93)
  • Rust UI开发(二):iced中如何为窗口添加icon图标

    注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 想要了解如何构建简单窗口的可以看本系列的第一篇: Rust UI开发:使用iced构建UI时,如何在界面显示中文字符 本篇是系列第二篇,主要解决一个问题,就是为窗口添加图标ic

    2024年02月04日
    浏览(62)
  • Windows10下docker安装指南及踩坑解决

    1.官网下载docker文件( 注意:Windows10家庭版要自己安装hyper-v,专业版以上自带) 顺利启动docker界面 虚拟化技术没打开,需要打开虚拟化hyper 解决:打开设置下的控制面板-程序和功能-启用和关闭windows功能-勾选打开hyper-v 备注:如遇hyper-v平台置灰无法打开,需要开启bios中的虚拟

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包