Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

news2024/10/7 6:50:28

注:此文适合于对rust有一些了解的朋友

iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。
在这里插入图片描述  
iced的基本逻辑是:
UI交互产生消息message,message传递给后台的update,在这个函数中编写逻辑,然后通过View函数更新UI。

  1. Take the result of our view logic and layout its widgets.
    获取视图逻辑的结果并布局其小部件。
  2. Process events from our system and produce messages for our update
    logic. 处理来自系统的事件,并为我们的更新逻辑生成消息。
  3. Draw the resulting user interface. 绘制生成的用户界面。

下面我们将通过举例来说明iced如何显示一个窗口,以及如何在窗口上显示中文。

一、如何用iced构建窗口:

我们构建一个基本窗口,窗口有一个按钮,一个文本框,一个标签,在文本框输入字符,点击按钮后,标签上显示相同内容。
UI实例预览:
在这里插入图片描述
在这里插入图片描述
1 导入库

use iced::widget::{button, column, text, text_input};    
use iced::{Alignment, Element, Sandbox, Settings};

2、配置Cargo.toml

[dependencies]   
iced="0.10"

这样,使用cargo check时,会自动安装iced库。

3、构建窗口程序

主函数:

pub fn main() -> iced::Result {     

    Counter::run(Settings::default())             //此处为使用默认窗口设置
  
}

定义数据结构:

//创建结构体struct
struct Counter{
    value: String,
    value2:String,
}

定义消息:

#[derive(Debug, Clone)]           //为下方的enum添加特性trait
enum Message {
    Showtext,
    InputChanged(String),
}

实现一个实例:

//sandbox是一个trait
impl Sandbox for Counter {             //impl将sandbox添加给Counter,使Counter具有了sandbox的一些特性
    type Message = Message;     
    fn new() -> Self {                  //初始化sandbox,返回初始值
        Self { 
            value: String::new(),
            value2:String::new(),
        }
    }

    fn title(&self) -> String {         //返回sandbox的标题
        String::from("iced_UI")
    }

    fn update(&mut self, message: Message) {        //此处书写更新逻辑程序,所有UI交互会在这里处理
       
        match message {
            Message::Showtext=> { 
                let ss=&self.value;  
                self.value2=ss.to_string(); 
                    
            }
            Message::InputChanged(value) =>{
                self.value=value;
            }
                
        }
    }

    fn view(&self) -> Element<Message> {            
  
        column![
            
            text_input("enter some string",&self.value)
            .on_input(Message::InputChanged)
            .padding(10)
            .size(16),
            button("push")
            .on_press(Message::Showtext)
            .padding(2)
            .width(40),  
            text(format!("enter text:{}",&self.value2)).size(16), 
                                             
        ]
        .spacing(10)
        .padding(6)
        .align_items(Alignment::Center)
        .into()
      
    }


}

完整代码:

use iced::widget::{button, column, text, text_input}; 
use iced::{Alignment, Element, Sandbox, Settings};


pub fn main() -> iced::Result {

    Counter::run(Settings::default())             //此处为使用默认窗口设置
  
}

//创建结构体struct
struct Counter{
    value: String,
    value2:String,
}

#[derive(Debug, Clone)]           //为下方的enum添加特性trait
enum Message {
    Showtext,
    InputChanged(String),
}



//sandbox是一个trait
impl Sandbox for Counter {             //impl将sandbox添加给Counter,使Counter具有了sandbox的一些特性
    type Message = Message;
    fn new() -> Self {                  //初始化sandbox,返回初始值
        Self { 
            value: String::new(),
            value2:String::new(),
        }
    }

    fn title(&self) -> String {         //返回sandbox的标题
        String::from("iced_UI")
    }

    fn update(&mut self, message: Message) {        //此处书写更新逻辑程序,所有UI交互会在这里处理
       
        match message {
            Message::Showtext=> { 
                let ss=&self.value;  
                self.value2=ss.to_string(); 
                    
            }
            Message::InputChanged(value) =>{
                self.value=value;
            }
                
        }
    }

    fn view(&self) -> Element<Message> {            
  
        column![
            
            text_input("enter some string",&self.value)
            .on_input(Message::InputChanged)
            .padding(10)
            .size(16),
            button("push")
            .on_press(Message::Showtext)
            .padding(2)
            .width(40),  
            text(format!("enter text:{}",&self.value2)).size(16), 
                                             
        ]
        .spacing(10)
        .padding(6)
        .align_items(Alignment::Center)
        .into()
      
    }


}

cargo run以上代码,演示如下:
在这里插入图片描述
由于涉及rust和iced两个方面的应用,在此,仅就iced的相关使用作一下说明,至于对rust的代码有疑问的,可以参考rust的官方手册。

impl Sandbox for Counter{}

这里的sandbox是iced库提供的一个简单的应用特性,它是一个trait,有update、view、run等函数功能,此处,update和view是两个有点对应的功能,当你在UI操作部件时,会产生交互消息message,update就是接受message的,你可以在update函数下,编写你的逻辑:
此例中,我的逻辑是,当在文本框输入信息时,实时文本会传给之前定义好的一个数据即value。当点击按钮时,会将文本框的数据传给另一个数据value2,然后value2是和用于显示的文本框绑定的。

  fn update(&mut self, message: Message) {        //此处书写更新逻辑程序,所有UI交互会在这里处理
       
        match message {          
            Message::Showtext=> { 
                let ss=&self.value;  
                self.value2=ss.to_string(); 
                    
            }
            Message::InputChanged(value) =>{
                self.value=value;
            }
                
        }
    }

value2通过view函数显示到UI界面。
下面的代码是其中一句,这里将text部件绑定了一个值self.value2即前面定义的value2。

 text(format!("enter text:{}",&self.value2)).size(16),   

二、如何在iced窗口显示中文:

但是上面的程序,有个小小的不足,就是窗口无法显示中文字符,比如,我将按钮的名称由push改成开始

button("开始")

再运行的话:
在这里插入图片描述
可以看到上图中按钮的名字变成了乱码,这是因为在窗口的设定时,使用了默认参数:

pub fn main() -> iced::Result {
    Counter::run(Settings::default())             //此处为使用默认窗口设置 
}

就是此处的Settings,而iced的默认窗口参数中,字体使用的是:SansSerif。因此不支持中文字符,所以,如果想要在UI界面用中文来表示各个部件的名称或注释,需要更改字体。

所以,此处我们对上面的程序进行修改,以便窗口可以显示中文,其实就是修改字体的设置。

首先需要添加导入:

use iced::Font;
use iced::font::Family;

然后,修改主函数中的run函数的Settings:

pub fn main() -> iced::Result {       
    //Counter::run(Settings::default())             //此处为使用默认窗口设置 
    let ff="Microsoft YaHei";     //设置自定义字体
    Counter::run(Settings {
        default_font:Font{                      //设置自定义字体,用于显示中文字符
            family:Family::Name(ff),
            ..Font::DEFAULT},
        ..Settings::default()
    })
}

和之前的主函数对一下,可以发现,这里我先定义了一个字符串,用来表示字体的名字,此处是微软雅黑字体。
然后在Settings中,将关于字体的default_font单独设置。
设置好后,我们再来cargo run一下:
在这里插入图片描述
可以看到,中文字符能正常显示了。
对上面的主函数,我们再做一下修改,使窗口启动时的尺寸按照我们想要的来,即自定义窗口尺寸:

先添加导入

use iced::window;

然后主函数:

pub fn main() -> iced::Result {    
    //Counter::run(Settings::default())             //此处为使用默认窗口设置 
    let ff="Microsoft YaHei";     //设置自定义字体
    Counter::run(Settings {
        window:window::Settings{                //设置自定义窗口尺寸
            size:(600,400),
            ..window::Settings::default()
        },
        default_font:Font{                      //设置自定义字体,用于显示中文字符
            family:Family::Name(ff),
            ..Font::DEFAULT},
        ..Settings::default()
    })
}

这样一来,窗口启动时不会按照默认的来,而是按照自己设定来显示。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

经典的回溯算法题leetcode全排列问题思路代码详解

目录 全排列问题 leetcode46题.全排列 leetcode47题.全排列II 对回溯算法感兴趣的朋友也可以多多支持一下我的其他文章。 回溯算法详解-CSDN博客 经典的回溯算法题leetcode组合问题整理及思路代码详解-CSDN博客 经典的回溯算法题leetcode子集问题思路代码详解-CSDN博客 …

ResizeObserver loop limit exceeded报错解决方案

前言&#xff1a; 控制台没有报错&#xff0c;但是开发Vue项目过程中一直报ResizeObserver loop limit exceeded 错&#xff0c;找到以下解决方式。在main.js文件中重写 ResizeObserver 方法。 main.js文件 &#xff08;完整版&#xff09; import { createApp } from "v…

基于element自动表格

需求是根据JSON文件生成表格&#xff0c;包含配置和自动props属性以及过滤器&#xff1b; 数据示例&#xff1a; 表格设置&#xff1a; /*** 表格表头信息* chineseToPinYin: 这是封装的根据中文汉字转换为拼音的方法* prop: 表头字段名* filter: 数据过滤器* label: 表头显示…

从零学算法400

400.给你一个整数 n &#xff0c;请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;0 解释&#xff1a;第…

Windows Python3安装salt模块失败处理

复现CVE-2020-11651时候运行CVE-2020-11651的poc时候需要salt模块 在下载时出现了错误 尝试在网上寻找解决方法&#xff1a; 1.更新 setuptools 和 wheel pip install --upgrade setuptools wheel 2. 安装Microsoft Visual C 14.0 因为salt模块包包使用了 C/C 扩展&#x…

Flutter开发警告Constructors in ‘@immutable‘ classes should be declared as ‘const‘

文章目录 警告信息报错代码警告原因修改后的代码 警告信息 Flutter开发遇到如下警告 Constructors in ‘immutable’ classes should be declared as ‘const’. 报错代码 class TaskWidget extends StatefulWidget {final String title;final bool isChecked;final int ord…

AD9528学习笔记

前言 AD9528是ADI的一款时钟芯片&#xff0c;由2-stage PLL组成&#xff0c;并且集成JESD204B/JESD204C SYSREF信号发生器&#xff0c;SYSREF发生器输出单次、N次或连续信号&#xff0c;并与PLL1和PLL2输出同步&#xff0c;从而可以实现多器件之间的同步。 AD9528总共有14路输…

电源模块重轻载变化测试的测试目的、测试标准、测试方法介绍

电源自动测试系统针对电源模块的各项测试项目提供最合适的测试方案&#xff0c;解决测试需求&#xff0c;提高测试效能。重轻载变化测试是电源模块测试的项目之一&#xff0c;是为了检测负载变化时输出电压的变化情况。为此&#xff0c;纳米软件将介绍电源重轻载变化测试的方法…

盘点43个Python登录第三方源码Python爱好者不容错过

盘点43个Python登录第三方源码Python爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 项目名称 bnuz中国电信校园网模拟登录&#xff0c;python selenium BNUZ教务系统认证爬虫Python语言实现&#xff0c;你可以用…

为什么在Pycharm中使用Pandas画图,却不显示?

问题描述&#xff1a; 在 Pycharm 中使用 Pandas 的 plot() 方法画图&#xff0c;却不显示图像&#xff0c;源代码如下&#xff1a; import pandas as pd import numpy as np# 从文件中读取数据 starbucks pd.read_csv(./file_csv/directory.csv)# 按照国家分组&#xff0c;…

【T3】畅捷通T3登录时操作日期的日历中日期与星期对应关系错误。

【问题描述】 畅捷通T3软件登录的时候&#xff0c; 在选择操作日期位置&#xff0c;点击出日历后发现&#xff1a; 几月几日和星期几是对不上的。但是查看电脑系统右下角日期&#xff0c;是正确的。 例如&#xff1a;2023年11月24日应该是星期五&#xff0c;这里反而是星期三。…

如何去掉图片水印不伤原图?无痕去水印教程分享!

如何去掉图片水印不伤原图&#xff1f;在电商广告设计和营销领域&#xff0c;水印已经成为一种常见的版权保护手段。不过&#xff0c;水印也给淘宝商家带来了一些困扰。那么如何去掉图片水印还能不伤原图呢&#xff0c;接下来&#xff0c;将分享简单好用的无痕去水印教程&#…

高级IO—select

高级IO—select 文章目录 高级IO—selectIO的概念 五种IO模型阻塞IO非阻塞IO信号驱动IOIO多路转接异步IO I/O多路转接之select IO的概念 通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。输入是系统接收的信号或数据&#xff0c;输出则是从其发送的信号或…

python中range函数的用法

range() 是Python的一个内置函数。语法格式为&#xff1a;range(start, stop, step) start是初始值&#xff0c;stop是最终值&#xff0c;step是步长。range()函数仅适用于整数&#xff0c;所有参数都必须是整数。步长值可以为正数或负数&#xff0c;不得为零。使用range函数时…

Mintegral业务再创新高,汇量科技基建成果已然显现?

游戏出海经过几年的跨越式发展&#xff0c;红海特征日益明显。 《2023中国游戏App出海驱动力报告》显示&#xff0c;2022年1月至2023年6月&#xff0c;我国约17000款游戏类App出海&#xff0c;安装总量超过240亿次。与此同时&#xff0c;Android和iOS侧的安装量在2022年三季度…

ONNX实践系列-修改yolov5-seg的proto分支输出shape

一、目标 本文主要介绍要将原始yolov5分割的输出掩膜从[b,c,h,.w]修改为[b, h, w, c] 原来的: 目标的: 代码如下: Descripttion: version: @Company: WT-XM Author: yang jinyi Date: 2023-09-08 11:26:28 LastEditors: yang jinyi LastEditTime: 2023-09-08 11:48:01 …

【深度学习】因果推断与机器学习

2023年初是人工智能爆发的里程碑式的重要阶段&#xff0c;以OpenAI研发的GPT为代表的大模型大行其道&#xff0c;NLP领域的ChatGPT模型火爆一时&#xff0c;引发了全民热议。而最新更新的GPT-4更是实现了大型多模态模型的飞跃式提升&#xff0c;它能够同时接受图像和文本的输入…

2023 Unite 大会关于“Muse“ AI 大模型训练

Unity Muse 借助强大的 AI 能力帮助你探索、构思和迭代&#xff0c;其中包括纹理和精灵两项功能&#xff0c;可将自然语言和视觉输入转化为可用资产。 将 AI 引入 Unity Editor 中的 Muse 提供了更快将想法转化为实物的选项。您可以调整并使用文本提示、图案、颜色和草图&…

全面预算管理,帮助企业财务团队冲破市场挑战

在实现企业财务发展的必经之路上&#xff0c;大多数财务专业人士会通过实施全面预算管理策略&#xff0c;为部门乃至整个组织建立一个用于数据管理和预测分析的财务模型&#xff0c;旨在影响和监控业务决策和变化趋势。全面预算管理通常包括历史数据分析和关于未来走向更详细的…

加入华为云鲲鹏极简开发创造营,激活创造力,探索无限可能!

数字经济时代&#xff0c;速度、效率、质量安全已成为各行业告诉拓新发展的关键&#xff0c;华为云不断打磨敏捷安全开发的软件平台&#xff0c;为更高效率的生产力变革积蓄能量。 在刚刚过去不久的2023华为全联接大会上&#xff0c;华为最新发布了华为云CodeArts与鲲鹏DevKit…