Rust+slint實現一個登錄demo

系列文章目錄


文章目錄

  • 系列文章目錄
  • 前言
  • 一、為什么前端選擇slint而不是Tauri或者其他GUI框架
  • 二、開發工具
  • 三、代碼編寫
    • 項目結構
    • 前端代碼編寫
    • 后端開發編寫
    • 運行效果
  • 總結


前言

本文章就是一個簡單rust全棧編程的一個小小的示例供rust新手閱讀學習。


一、為什么前端選擇slint而不是Tauri或者其他GUI框架

下面是我AI出來的一張表

框架GUI 模式渲染后端性能優勢最佳適用場景
??egui?? 即時模式wgpu/glow ??極高渲染幀率??,實時響應游戲工具、實時數據儀表盤、調試界面
??Iced??保留模式 (Elm)wgpu/glow/tiny_skia??良好的渲染性能??,高效更新通用桌面應用、工具軟件
??Slint??保留模式 (DSL)自有高效渲染器 ??最低內存占用??,??最快啟動??嵌入式系統、資源敏感型應用、Kiosk
??Tauri??Web (任何前端框架)系統 WebView ??高開發效率??,??安裝包小??商業桌面應用、利用現有Web技術的項目
??GTK-rs?? 保留模式 (GTK)Cairo/GTK原生外觀,穩定希望與 GNOME/Linux 桌面深度集成的應用

其是我選擇slint的主要原因就是看重它的高性能和跨平臺能力,對于手機或者樹莓派這類內存敏感平臺會更友好一些。

二、開發工具

這里我選擇的是RustRover它對新手會友好一些,代碼提示豐富,開發起來效率也會高一些。
使用slintGUI框架的話RustRover也有對應的插件,可以預覽窗體效果

三、代碼編寫

項目結構

首先安裝號rust的開發環境,具體怎么安裝可以在網上尋找教程

在控制輸入命令

cargo new slint-test

創建一個rust的項目
打開之后項目結構如下;新創建的項目不會有assets和ui這兩個文件夾和build.rs文件,因為這是我自己創建的
在這里插入圖片描述

前端代碼編寫

前端的代碼我把它和rust分開了,方便項目管理,這里我創建了一個ui文件夾,里面主要是放.slint文件也就是前端文件
在這里插入圖片描述
login.slint 文件中的代碼如下:

import { VerticalBox, HorizontalBox, LineEdit, Button, CheckBox } from "std-widgets.slint";
import "../assets/fonts/Amble-Regular.ttf";
export component LoginWindow inherits Window {default-font-family: "Amble";preferred-width: 500px;preferred-height: 400px;title: "用戶登錄";icon: @image-url("../assets/icons/windowlog.png");in-out property <string> userName: "";in-out property <string> passWord: "";in-out property <bool> remember-me: false;in-out property <string> message: "";callback login();// 1. 先把整個內容放進一個占滿窗口的布局VerticalLayout {alignment: center; // 垂直居中HorizontalLayout {alignment: center; // 水平居中// 2. 真正負責外觀的卡片Rectangle {background: #ffffff;border-radius: 8px;drop-shadow-offset-x: 2px;drop-shadow-offset-y: 2px;drop-shadow-blur: 6px;drop-shadow-color: #00000030;width: 450px;VerticalLayout {spacing: 12px;padding: 20px;// 標題Text {text: "用戶登錄";font-size: 24px;color: #2c3e50;font-weight: 700;horizontal-alignment: center;}// 表單區域VerticalLayout {spacing: 10px;width: 400px;// 用戶名輸入HorizontalLayout {spacing: 10px;height: 40px;Text {text: "用戶名:";width: 80px;horizontal-alignment: right;vertical-alignment: center;}LineEdit {placeholder-text: "請輸入用戶名";text <=> root.userName;}}// 密碼輸入HorizontalLayout {spacing: 10px;height: 40px;Text {text: "密碼:";width: 80px;horizontal-alignment: right;vertical-alignment: center;}LineEdit {placeholder-text: "請輸入密碼";text <=> root.passWord;input-type: password;}}// 記住我選項CheckBox {text: "記住登錄狀態";checked <=> root.remember-me;}}// 登錄按鈕HorizontalLayout {alignment: center;Button {text: "登  錄";clicked => {root.login();}width: 120px;height: 36px;}}// 消息提示Text {color: #e74c3c;height: 20px;text <=> root.message;}}}}}
}

在代碼中有這樣一句代碼:
這里是我放置的字體文件;

import "../assets/fonts/Amble-Regular.ttf";

assets 文件夾主要就是放一些靜態文件
目前主要是放一下圖標和字體文件
在這里插入圖片描述

后端開發編寫

后端主要就是做了一個密碼校驗和一些簡單的邏輯處理

slint::include_modules!();  // 導入編譯生成的 UI 代碼
use std::time::Duration;
fn main() -> Result<(), slint::PlatformError> {let ui = LoginWindow::new()?;// 加載保存的用戶名和密碼(示例中簡單實現)if let Some((user, pass)) = load_credentials() {ui.set_userName(user.into());ui.set_passWord(pass.into());ui.set_remember_me(true);}let ui_handle = ui.as_weak();ui.on_login(move || {let ui = ui_handle.unwrap();let username = ui.get_userName();let password = ui.get_passWord();let remember = ui.get_remember_me();// 簡單的驗證邏輯if username.is_empty() || password.is_empty() {ui.set_message("用戶名和密碼不能為空".into());return;}// 模擬網絡請求延遲slint::spawn_local({let ui_weak = ui.as_weak();async move {// 模擬網絡請求async_std::task::sleep(Duration::from_secs(1)).await;let success = username == "admin" && password == "123456";ui_weak.upgrade_in_event_loop(move |ui| {ui.set_message(if success {if remember {save_credentials(&username, &password);} else {clear_credentials();}"登錄成功!".into()} else {"用戶名或密碼錯誤".into()});}).unwrap();}}).expect("程序內部錯誤!");});ui.run()
}// 簡單的憑證存儲(實際應用中應該加密)
fn save_credentials(username: &str, password: &str) {// 這里應該使用更安全的方式存儲println!("保存憑證: {}:{}", username, password);
}fn load_credentials() -> Option<(String, String)> {// 這里從安全存儲中加載Some(("admin".into(), "123456".into())) // 示例中硬編碼
}fn clear_credentials() {println!("清除保存的憑證");
}

在代碼開頭有這樣一句代碼

slint::include_modules!();

這里是因為我在build.rs文件中進行了處理所有這里就不需要導入指定的slint文件
在這里插入圖片描述
build.rs文件代碼如下:

fn main() {slint_build::compile("src/ui/login.slint").unwrap();
}

運行效果

打開RustRover 輸入命令:cargo run

在這里插入圖片描述
執行效果如下:
在這里插入圖片描述


總結

以上就是今天要講的內容,本文僅僅簡單介紹了rust+slint的使用。rust是一門很好的語言沒有GC不用擔心對象跑飛。性能也和c和c++不相上下,卻比他們更安全。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921222.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921222.shtml

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

相關文章

2025前端面試題及答案(詳細)

HTML5 的新特性有哪些&#xff1f;簡約版本&#xff1a;“HTML5 新特性主要體現在六個方面&#xff1a; 第一&#xff0c;語義化標簽&#xff0c;比如 header、footer、nav 等&#xff0c;讓頁面結構更清晰&#xff1b; 第二&#xff0c;表單增強&#xff0c;新增了 date、emai…

分詞器詳解(二)

&#x1f50d; 第2層&#xff1a;中等深度&#xff08;15分鐘理解&#xff09; 1. 理論基礎 1.1 BPE的數學原理 核心思想&#xff1a;通過迭代合并高頻字符對構建詞匯表 算法形式化&#xff1a; 初始化詞匯表 V0{c1,c2,...,cn}V_0 \{c_1, c_2, ..., c_n\}V0?{c1?,c2?,...,c…

嵌入式學習 51單片機(3)

UART 概述通用異步收發器&#xff08;UART&#xff09;是一種全雙工、串行、異步通信協議&#xff0c;常用于設備間數據傳輸。包含兩根信號線&#xff1a;RXD&#xff08;接收信號線&#xff09;TXD&#xff08;發送信號線&#xff09;通信方式單工通信方向固定&#xff0c;僅支…

Redis AOF 持久化:銀行的 “交易流水單” 管理邏輯

目錄 一、AOF 的核心邏輯&#xff1a;“每筆交易都記流水” 二、AOF 的三個步驟&#xff1a;從 “臨時記錄” 到 “正式歸檔” 1. 命令追加&#xff1a;記到 “臨時小本本” 2. 寫入與同步&#xff1a;抄到 “正式流水冊” 3. AOF 還原&#xff1a;拿 “流水冊” 重放交易…

代碼隨想錄訓練營第三十天|LeetCode452.用最少數量的箭引爆氣球、LeetCode435.無重疊空間、LeetCode763.劃分字母空間

452.用最少數量的箭引爆氣球 貪心算法 重合最多的氣球射一箭&#xff0c;就是局部用箭數量最少的&#xff0c;全局的用箭數量就是最少的。 首先對二維數組進行排序&#xff0c;這樣就可以讓氣球更加緊湊。 思路&#xff1a;當前氣球是否和上一個氣球區間重合&#xff0c;如…

數據庫事務隔離級別與 MVCC 機制詳解

最近在準備面試&#xff0c;正把平時積累的筆記、項目中遇到的問題與解決方案、對核心原理的理解&#xff0c;以及高頻業務場景的應對策略系統梳理一遍&#xff0c;既能加深記憶&#xff0c;也能讓知識體系更扎實&#xff0c;供大家參考&#xff0c;歡迎討論。在數據庫并發操作…

【Cursor-Gpt-5-high】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill&#xff0c;在學習時我嘗試使用相同命令訓練同一個任務&#xff0c;但是我發現最終的 success_once 指標并不是相同的&#xff0c;我感到十分焦慮&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id"…

文檔權限設置不合理會帶來哪些問題

文檔權限設置不合理會導致信息泄露、合規風險、協作效率下降、責任難以追溯、知識資產流失、員工信任受損、管理成本增加、企業戰略受阻。這些問題不僅影響日常運營&#xff0c;更會對企業的長遠發展構成威脅。根據IBM《2024數據泄露成本報告》&#xff0c;全球企業因數據泄露的…

Linux網絡服務——基礎設置

網絡服務命令1.ping命令作用&#xff1a;測試網絡連通性&#xff08;使用icmp協議&#xff09;常見選項&#xff1a;-c&#xff1a;指定ping的次數&#xff0c;默認無限次-I&#xff1a;指定發送請求的網卡[rootlocalhost ~]# ping 192.168.77.78 -c 4 -I ens160 PING 192.168.…

【multisim汽車尾燈設計】2022-12-1

緣由multisim汽車尾燈設計-學習和成長-CSDN問答 為什么模仿別人做的運行沒啥效果&#xff0c;啥也看不明白&#xff0c;數字電子技術要做的任務。

Langchain在調用 LLM 時統計 Token 消耗

關鍵點解析使用上下文管理器with get_openai_callback() as cb:這一行是核心。cb 會自動收集本次調用的 prompt tokens、completion tokens 以及 total tokens。自動統計在上下文退出時&#xff0c;cb 中已經包含了這次調用的消耗情況&#xff0c;無需額外手動計算。累加到全局…

漫談《數字圖像處理》之實時美顏技術

隨著移動拍攝、直播、短視頻等場景的普及&#xff0c;用戶對 “自然、流暢、可控” 的美顏效果需求日益提升 —— 既要消除皮膚瑕疵、優化面部形態&#xff0c;又需避免 “過度磨皮顯假”“變形失真”“實時卡頓” 等問題。實時美顏技術的核心并非單一算法的堆砌&#xff0c;而…

MATLAB基于PSO(粒子群算法)優化BP神經網絡和NSGA-II(非支配排序遺傳算法)多目標優化

代碼實現了一個智能算法優化BP神經網絡并進行多目標優化的完整流程&#xff0c;結合了PSO&#xff08;粒子群算法&#xff09;優化BP神經網絡和NSGA-II&#xff08;非支配排序遺傳算法&#xff09;多目標優化&#xff0c;用于多輸入多輸出的回歸預測問題。 ? 一、主要功能 數…

白平衡分塊統計數據為什么需要向下采樣?

在白平衡處理中&#xff0c;分塊統計數據時引入**向下采樣&#xff08;Downsampling&#xff09;**&#xff0c;核心目標是在保證統計有效性的前提下&#xff0c;解決“計算效率”與“統計魯棒性”的矛盾&#xff0c;同時避免局部噪聲對白平衡判斷的干擾。要理解這一設計的必要…

Deathnote: 1靶場滲透

Deathnote: 1 來自 <Deathnote: 1 ~ VulnHub> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168.23.129 3&#xff0c;對靶機進行端口…

windows系統服務器測試部署springboot+vue+mysql項目

1. 后端Java應用啟動 直接使用命令行啟動&#xff08;推薦用于測試&#xff09;&#xff1a; cd C:\Users\Administrator\Desktop\toolset\backed java -jar -Dspring.profiles.activeprod -Dserver.port8083 admin.jar2. 前端靜態文件服務 由于你已經有了dist目錄&#xff0c;…

Java 與 Docker 的最佳實踐

在云原生時代&#xff0c;Docker 已成為應用交付和運行的事實標準。Java 作為企業級開發的主力語言&#xff0c;也需要與容器技術深度結合。然而&#xff0c;Java 程序天然有 JVM 內存管理、啟動速度、鏡像體積 等特點&#xff0c;如果不做優化&#xff0c;可能導致性能下降甚至…

大數據工程師認證推薦項目:基于Spark+Django的學生創業分析可視化系統技術價值解析

&#x1f496;&#x1f496;作者&#xff1a;計算機編程小央姐 &#x1f499;&#x1f499;個人簡介&#xff1a;曾長期從事計算機專業培訓教學&#xff0c;本人也熱愛上課教學&#xff0c;語言擅長Java、微信小程序、Python、Golang、安卓Android等&#xff0c;開發項目包括大…

【MySQL自學】SQL主鍵使用誤區:你必須知道的關鍵細節

在日常數據庫操作中&#xff0c;主鍵&#xff08;Primary Key&#xff09;是我們最常打交道的概念之一。然而&#xff0c;許多開發者&#xff0c;尤其是初學者&#xff0c;常常對其存在一些誤解。一個非常經典的問題是&#xff1a;“在SQL中&#xff0c;只要用到主鍵&#xff0…

Electron 執行python腳本

1 需求背景 有個需求需要Electron執行在本地執行python腳本。希望通過Electron調用python服務并且實現雙向通信。 2 解決思路 使用Electon 的{ exec, spawn, execFile, fork } from "child_process"; 能力來執行python腳本&#xff0c;使用spawn可以實現持續交互&…