Rust UI開發(一):使用iced構建UI時,如何在界面顯示中文字符

注:此文適合于對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.pswp.cn/news/167871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167871.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023-11-24--oracle--實驗--[Merge 語句]

oracle--實驗---Merge語句 1.認知Merge 語句 ? merge 語句是 sql 語句的一種。在 SQL server 、 Oracle 數據庫中可用&#xff0c; MySQL 中不可用。 ? merge 用來合并 update 和 insert 語句。目的&#xff1a;通過 merge 語句&#xff0c;根據一張表&#xff08; 原數據表…

IOS免簽封裝打包蘋果APP的方法

IOS免簽app封裝打包蘋果APP的方法如下&#xff1a; 準備一個未簽名的IPA文件。獲取一個企業證書或個人證書&#xff0c;用于簽名IPA文件。將證書添加到Keychain Access中。安裝iOS App Signer&#xff08;可以在網上找到相關下載鏈接&#xff09;。打開iOS App Signer&#xf…

AT360-6T GNSS 單頻高精度授時模塊特性參數

AT360-6T 模塊具有高靈敏度、低功耗、低cost等優勢&#xff0c;可以滿足電力授時&#xff0c;通信授時等領域的應用。AT360-6T特點&#xff1a; 1.支持北斗二代/北斗三代信號 2.高精度授時 3.可靠性授時 實時高精度授時 AT360-6T 系列模塊的授時秒脈沖抖動可以達到 10ns&am…

Vue學習筆記-搭建Vuex

1.概念 在Vue實現集中式狀態&#xff08;數據&#xff09;管理的一個插件&#xff0c;對Vue中多個組件的共享狀態進行集中式的管理&#xff08;讀/寫&#xff09;&#xff0c;也是一種組件間的通信方式&#xff0c;適用于任意組件間的通信 2.使用場景 多個組件需要共享數據時…

Mysql存儲引擎分類

Mysql存儲引擎分類&#xff1a; 在選擇存儲引擎時&#xff0c;應該根據應用系統的特點選擇合適的存儲引擎。對于復雜的應用系統&#xff0c;還可以根據實際情況選擇多種存儲引擎進行組合。 InnoDB: 是Mysql的默認存儲引擎&#xff0c;支持事務、外鍵。如果應用對事務的完整性有…

杰發科技AC7801——ADC軟件觸發的簡單使用

前言 7801資料讀起來不是很好理解&#xff0c;大概率是之前MTK的大佬寫的。在此以簡單的方式進行描述。我們做一個簡單的規則組軟件觸發Demo。因為規則組通道只有一個數據寄存器&#xff0c;因此還需要用上DMA方式搬運數據到內存。 AC7801的ADC簡介 7801的ADC是一種 12 位 逐…

一文學會qml自定義組件

文章目錄 最簡單的自定義控件:自定義按鈕組件添加自定義信號在QML中,自定義組件通常是通過創建一個新的QML文件來實現的,這個文件定義了組件的屬性、信號、槽以及界面。你可以將這個組件看作是一個可重用的模塊,它可以在不同的QML場景中使用,而不需要重復編寫代碼。 以下…

洛谷P1157組合的輸出 遞歸:我他又來辣

沒沒沒沒沒沒沒錯&#xff0c;這是一道簡單的遞歸&#xff08;其實是深搜加回溯) 我不管&#xff0c;我說是遞歸就是遞歸。 上題干&#xff1a; 題目描述 排列與組合是常用的數學方法&#xff0c;其中組合就是從 n 個元素中抽出 r個元素&#xff08;不分順序且 r≤n&#x…

查swap內存使用

查詢linux的swap被什么使用了 查詢centos的swap被什么進程使用了 swap內存被什么程序占用&#xff0c;什么程序使用了swap分區&#xff0c;占用swap內存的進程 查系統使用swap內存前10個進程&#xff1a; for i in $( cd /proc;ls |grep "^[0-9]"|awk $0 >10…

大數據技術之數據安全與網絡安全——CMS靶場實訓

大數據技術之數據安全與網絡安全——CMS靶場實訓 在當今數字化時代&#xff0c;大數據技術的迅猛發展帶來了前所未有的數據增長&#xff0c;同時也催生了對數據安全和網絡安全的更為迫切的需求。本篇博客將聚焦于大數據技術背景下的數據安全與網絡安全&#xff0c;并通過CMS&a…

C語言-指針講解(3)

文章目錄 1.字符指針變量1.1 字符指針變量類型是什么1.2字符指針變量的兩種使用方法&#xff1a;1.3字符指針筆試題講解1.3.1 代碼解剖 2.數組指針變量2.1 什么是數組指針2.2 數組指針變量是什么&#xff1f;2.2.3 數組指針變量的舉例 2.3數組指針和指針數組的區別是什么&#…

npm ERR! node-sass@4.13.0 postinstall: `node scripts/build.js`

npm ERR! node-sass4.13.0 postinstall: node scripts/build.js npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install npm run dev Microsoft Windows [版本 10.0.19045.2965] (c) Microsoft Corporation。保留所有權利。C:\Users\Administr…

4.操作系統常見面試題(2)

3.4 虛擬內存 直接使?物理內存會產??些問題 1. 內存空間利?率的問題&#xff1a;各個進程對內存的使?會導致內存碎?化&#xff0c;當要? malloc 分配?塊很?的內存空間時&#xff0c;可能會出現雖然有?夠多的空閑物理內存&#xff0c;卻沒有?夠?的連續空閑內存這種…

手動實現 git 的 git diff 功能

這是 git diff 后的效果&#xff0c;感覺挺簡單的&#xff0c;不就是 比較新舊版本&#xff0c;新增了就用 "" 顯示新加一行&#xff0c;刪除了就用 "-" 顯示刪除一行&#xff0c;修改了一行就用 "-"、"" 顯示將舊版本中的該行干掉了并…

騰訊云AMD服務器標準型SA5實例AMD EPYC Bergamo處理器

騰訊云服務器標準型SA5實例是最新一代的標準型實例&#xff0c;CPU采用AMD EPYC? Bergamo全新處理器&#xff0c;采用最新DDR5內存&#xff0c;默認網絡優化&#xff0c;最高內網收發能力達4500萬pps。騰訊云百科txybk.com分享騰訊云標準型SA5云服務器CPU、內存、網絡、性能、…

Python 忽略warning警告錯誤 + 跳過報錯繼續執行程序

如何主動產生warning錯誤: import warnings def fxn(): warnings.warn("deprecated", DeprecationWarning) with warnings.catch_warnings(): warnings.simplefilter("ignore") fxn() 那么如何來控制警告錯誤的輸出呢? import warnings warnings.fi…

Modown主題v8.12 安裝教程和主題下載

親測」Modown主題v8.12學習版 上傳好主題選擇該主題就好了設置 設置好的首頁 內容頁&#xff1a; WordPress主題Modown和WordPress插件Erphpdown想必正在使用WordPress程序建站的站長都非常熟悉&#xff0c;因為這兩款應用在WordPress站長圈子里還是比較知名的&#xff0c;所以…

計算機畢業設計 基于SpringBoot的無人智慧超市管理系統的設計與實現 Java實戰項目 附源碼+文檔+視頻講解+答疑

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精…

GoLang Filepath.Walk遍歷優化

原生標準庫在文件量過大時效率和內存均表現不好 1400萬文件遍歷Filepath.Walk 1400萬文件重寫直接調用windows api并處理細節 結論 1400萬文件遍歷時對比 對比條目filepath.walkwindows api并觸發黑科技運行時間710秒22秒內存占用480M38M 關鍵代碼 //超級快的文件遍歷 fun…

【HuggingFace Transformer庫學習筆記】基礎組件學習:pipeline

一、Transformer基礎知識 pip install transformers datasets evaluate peft accelerate gradio optimum sentencepiece pip install jupyterlab scikit-learn pandas matplotlib tensorboard nltk rouge在host文件里添加途中信息&#xff0c;可以避免運行代碼下載模型時候報錯…