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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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可以实现持续交互&…